Hey all,
I have a ready application. I can use it by running from android studio but while generating apk for it, I got a build error
Build command failed.
Error while executing process C:\Users\itsme\AppData\Local\Android\Sdk\cmake\3.10.2.4988404\bin\ninja.exe with arguments {-C C:\Development\android cocos games\Jump\cocos2d\cocos\platform\android\libcocos2dx\.cxx\cmake\debug\x86_64 MyGame}
ninja: Entering directory `C:\Development\android cocos games\Jump\cocos2d\cocos\platform\android\libcocos2dx\.cxx\cmake\debug\x86_64'
ninja: error: '../../../../../../../../external/Box2D/prebuilt/android/x86_64/libbox2d.a', needed by '../../../../build/intermediates/cmake/debug/obj/x86_64/libMyGame.so', missing and no known rule to make it
here is my build.gradle
apply plugin: 'com.android.application'
android {
compileSdkVersion PROP_COMPILE_SDK_VERSION.toInteger()
defaultConfig {
applicationId "org.cocos2dx.Jump"
minSdkVersion PROP_MIN_SDK_VERSION
targetSdkVersion PROP_TARGET_SDK_VERSION
versionCode 1
versionName "1.0"
externalNativeBuild {
cmake {
targets 'MyGame'
arguments "-DCMAKE_FIND_ROOT_PATH=", "-DANDROID_STL=c++_static", "-DANDROID_TOOLCHAIN=clang", "-DANDROID_ARM_NEON=TRUE"
cppFlags "-frtti -fexceptions -fsigned-char"
}
}
ndk.abiFilters 'armeabi-v7a','arm64-v8a','x86','x86_64'
}
sourceSets.main {
java.srcDir "src"
res.srcDir "res"
manifest.srcFile "AndroidManifest.xml"
assets.srcDir "../../Resources"
}
externalNativeBuild {
cmake {
path "../../CMakeLists.txt"
}
}
signingConfigs {
release {
if (project.hasProperty("RELEASE_STORE_FILE")) {
storeFile file(RELEASE_STORE_FILE)
storePassword RELEASE_STORE_PASSWORD
keyAlias RELEASE_KEY_ALIAS
keyPassword RELEASE_KEY_PASSWORD
}
}
}
buildTypes {
release {
debuggable false
jniDebuggable false
renderscriptDebuggable false
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
if (project.hasProperty("RELEASE_STORE_FILE")) {
signingConfig signingConfigs.release
}
}
debug {
debuggable true
jniDebuggable true
renderscriptDebuggable true
}
}
ndkVersion '21.0.6113669'
}
android.applicationVariants.all { variant ->
def project_root_folder = "${projectDir}/../.."
def dest_assets_folder = "${projectDir}/assets"
// delete previous files first
delete dest_assets_folder
def targetName = variant.name.capitalize()
def copyTaskName = "copy${targetName}ResourcesToAssets"
tasks.register(copyTaskName) {
copy {
from "${buildDir}/../../../Resources"
into "${buildDir}/intermediates/assets/${variant.dirName}"
exclude "**/*.gz"
}
}
tasks.getByName("pre${targetName}Build").dependsOn copyTaskName
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation project(':libcocos2dx')
}
Can someone please help me
Thanks in advance.
I have Box2d. But inside Box2d/prebuilt/android/ folder, there are only these three folders:
arm64-v8a, armeabi-v7a, x86
and error is something related to x86_64 which is not there
I’m not exactly sure, but does it have something to do with this line?
Actually in the fresh project there were these lines
ndk {
abiFilters = []
abiFilters.addAll(PROP_APP_ABI.split(’:’).collect{it as String})
}
instead of this
but I was getting some syncing error. So I changed it according to studio refence https://developer.android.com/studio/projects/gradle-external-native-builds
R101
September 4, 2020, 6:02pm
#6
If you’re going to build for x86 and x86_64, then you’ll have to build your own version of the x86_64 Box2D library.
The alternative is to not use the prebuilt version that comes with Cocos2d-x, and just build it from source.
For example, download the Box2d source code from here , put it in your [gameproject]/external/Box2D
folder, and then modify your game project root CMakeLists.txt
to build and link the library:
#disable the built-in Box2D first
set(BUILD_EXT_BOX2D OFF CACHE BOOL "Build with internal Box2D support" FORCE)
# build and link the Box2D source
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/external/Box2D ${PROJECT_BINARY_DIR}/Box2D)
get_target_property(box2d_INCLUDE_DIRS Box2D INTERFACE_INCLUDE_DIRECTORIES)
target_include_directories(cocos2d PRIVATE ${box2d_INCLUDE_DIRS}) #cocos2d lib needs the path too
target_link_libraries(${APP_NAME} PRIVATE Box2D)
target_include_directories(${APP_NAME}
PRIVATE ${box2d_INCLUDE_DIRS}
)
Here’s an example Box2D CMakeLists.txt, and from it you can figure out how to organise the source code for Box2D:
cmake_minimum_required(VERSION 3.6)
project(Box2D)
if(UNIX)
set(BOX2D_INSTALL_BY_DEFAULT ON)
else(UNIX)
set(BOX2D_INSTALL_BY_DEFAULT OFF)
endif(UNIX)
option(BOX2D_INSTALL "Install Box2D libs, includes, and CMake scripts" ${BOX2D_INSTALL_BY_DEFAULT})
option(BOX2D_BUILD_SHARED "Build Box2D shared libraries" OFF)
option(BOX2D_BUILD_STATIC "Build Box2D static libraries" ON)
set(BOX2D_VERSION 2.3.1)
set(LIB_INSTALL_DIR lib${LIB_SUFFIX})
set(BOX2D_Collision_SRCS
${CMAKE_CURRENT_LIST_DIR}/Collision/b2BroadPhase.cpp
${CMAKE_CURRENT_LIST_DIR}/Collision/b2CollideCircle.cpp
${CMAKE_CURRENT_LIST_DIR}/Collision/b2CollideEdge.cpp
${CMAKE_CURRENT_LIST_DIR}/Collision/b2CollidePolygon.cpp
${CMAKE_CURRENT_LIST_DIR}/Collision/b2Collision.cpp
${CMAKE_CURRENT_LIST_DIR}/Collision/b2Distance.cpp
${CMAKE_CURRENT_LIST_DIR}/Collision/b2DynamicTree.cpp
${CMAKE_CURRENT_LIST_DIR}/Collision/b2TimeOfImpact.cpp
)
set(BOX2D_Collision_HDRS
${CMAKE_CURRENT_LIST_DIR}/include/Box2D/Collision/b2BroadPhase.h
${CMAKE_CURRENT_LIST_DIR}/include/Box2D/Collision/b2Collision.h
${CMAKE_CURRENT_LIST_DIR}/include/Box2D/Collision/b2Distance.h
${CMAKE_CURRENT_LIST_DIR}/include/Box2D/Collision/b2DynamicTree.h
${CMAKE_CURRENT_LIST_DIR}/include/Box2D/Collision/b2TimeOfImpact.h
)
set(BOX2D_Shapes_SRCS
${CMAKE_CURRENT_LIST_DIR}/Collision/Shapes/b2CircleShape.cpp
${CMAKE_CURRENT_LIST_DIR}/Collision/Shapes/b2EdgeShape.cpp
${CMAKE_CURRENT_LIST_DIR}/Collision/Shapes/b2ChainShape.cpp
${CMAKE_CURRENT_LIST_DIR}/Collision/Shapes/b2PolygonShape.cpp
)
set(BOX2D_Shapes_HDRS
${CMAKE_CURRENT_LIST_DIR}/include/Box2D/Collision/Shapes/b2CircleShape.h
${CMAKE_CURRENT_LIST_DIR}/include/Box2D/Collision/Shapes/b2EdgeShape.h
${CMAKE_CURRENT_LIST_DIR}/include/Box2D/Collision/Shapes/b2ChainShape.h
${CMAKE_CURRENT_LIST_DIR}/include/Box2D/Collision/Shapes/b2PolygonShape.h
${CMAKE_CURRENT_LIST_DIR}/include/Box2D/Collision/Shapes/b2Shape.h
)
set(BOX2D_Common_SRCS
${CMAKE_CURRENT_LIST_DIR}/Common/b2BlockAllocator.cpp
${CMAKE_CURRENT_LIST_DIR}/Common/b2Draw.cpp
${CMAKE_CURRENT_LIST_DIR}/Common/b2Math.cpp
${CMAKE_CURRENT_LIST_DIR}/Common/b2Settings.cpp
${CMAKE_CURRENT_LIST_DIR}/Common/b2StackAllocator.cpp
${CMAKE_CURRENT_LIST_DIR}/Common/b2Timer.cpp
)
set(BOX2D_Common_HDRS
${CMAKE_CURRENT_LIST_DIR}/include/Box2D/Common/b2BlockAllocator.h
${CMAKE_CURRENT_LIST_DIR}/include/Box2D/Common/b2Draw.h
${CMAKE_CURRENT_LIST_DIR}/include/Box2D/Common/b2GrowableStack.h
${CMAKE_CURRENT_LIST_DIR}/include/Box2D/Common/b2Math.h
${CMAKE_CURRENT_LIST_DIR}/include/Box2D/Common/b2Settings.h
${CMAKE_CURRENT_LIST_DIR}/include/Box2D/Common/b2StackAllocator.h
${CMAKE_CURRENT_LIST_DIR}/include/Box2D/Common/b2Timer.h
)
set(BOX2D_Dynamics_SRCS
${CMAKE_CURRENT_LIST_DIR}/Dynamics/b2Body.cpp
${CMAKE_CURRENT_LIST_DIR}/Dynamics/b2ContactManager.cpp
${CMAKE_CURRENT_LIST_DIR}/Dynamics/b2Fixture.cpp
${CMAKE_CURRENT_LIST_DIR}/Dynamics/b2Island.cpp
${CMAKE_CURRENT_LIST_DIR}/Dynamics/b2World.cpp
${CMAKE_CURRENT_LIST_DIR}/Dynamics/b2WorldCallbacks.cpp
)
set(BOX2D_Dynamics_HDRS
${CMAKE_CURRENT_LIST_DIR}/include/Box2D/Dynamics/b2Body.h
${CMAKE_CURRENT_LIST_DIR}/include/Box2D/Dynamics/b2ContactManager.h
${CMAKE_CURRENT_LIST_DIR}/include/Box2D/Dynamics/b2Fixture.h
${CMAKE_CURRENT_LIST_DIR}/include/Box2D/Dynamics/b2Island.h
${CMAKE_CURRENT_LIST_DIR}/include/Box2D/Dynamics/b2TimeStep.h
${CMAKE_CURRENT_LIST_DIR}/include/Box2D/Dynamics/b2World.h
${CMAKE_CURRENT_LIST_DIR}/include/Box2D/Dynamics/b2WorldCallbacks.h
)
set(BOX2D_Contacts_SRCS
${CMAKE_CURRENT_LIST_DIR}/Dynamics/Contacts/b2CircleContact.cpp
${CMAKE_CURRENT_LIST_DIR}/Dynamics/Contacts/b2Contact.cpp
${CMAKE_CURRENT_LIST_DIR}/Dynamics/Contacts/b2ContactSolver.cpp
${CMAKE_CURRENT_LIST_DIR}/Dynamics/Contacts/b2PolygonAndCircleContact.cpp
${CMAKE_CURRENT_LIST_DIR}/Dynamics/Contacts/b2EdgeAndCircleContact.cpp
${CMAKE_CURRENT_LIST_DIR}/Dynamics/Contacts/b2EdgeAndPolygonContact.cpp
${CMAKE_CURRENT_LIST_DIR}/Dynamics/Contacts/b2ChainAndCircleContact.cpp
${CMAKE_CURRENT_LIST_DIR}/Dynamics/Contacts/b2ChainAndPolygonContact.cpp
${CMAKE_CURRENT_LIST_DIR}/Dynamics/Contacts/b2PolygonContact.cpp
)
set(BOX2D_Contacts_HDRS
${CMAKE_CURRENT_LIST_DIR}/include/Box2D/Dynamics/Contacts/b2CircleContact.h
${CMAKE_CURRENT_LIST_DIR}/include/Box2D/Dynamics/Contacts/b2Contact.h
${CMAKE_CURRENT_LIST_DIR}/include/Box2D/Dynamics/Contacts/b2ContactSolver.h
${CMAKE_CURRENT_LIST_DIR}/include/Box2D/Dynamics/Contacts/b2PolygonAndCircleContact.h
${CMAKE_CURRENT_LIST_DIR}/include/Box2D/Dynamics/Contacts/b2EdgeAndCircleContact.h
${CMAKE_CURRENT_LIST_DIR}/include/Box2D/Dynamics/Contacts/b2EdgeAndPolygonContact.h
${CMAKE_CURRENT_LIST_DIR}/include/Box2D/Dynamics/Contacts/b2ChainAndCircleContact.h
${CMAKE_CURRENT_LIST_DIR}/include/Box2D/Dynamics/Contacts/b2ChainAndPolygonContact.h
${CMAKE_CURRENT_LIST_DIR}/include/Box2D/Dynamics/Contacts/b2PolygonContact.h
)
set(BOX2D_Joints_SRCS
${CMAKE_CURRENT_LIST_DIR}/Dynamics/Joints/b2DistanceJoint.cpp
${CMAKE_CURRENT_LIST_DIR}/Dynamics/Joints/b2FrictionJoint.cpp
${CMAKE_CURRENT_LIST_DIR}/Dynamics/Joints/b2GearJoint.cpp
${CMAKE_CURRENT_LIST_DIR}/Dynamics/Joints/b2Joint.cpp
${CMAKE_CURRENT_LIST_DIR}/Dynamics/Joints/b2MotorJoint.cpp
${CMAKE_CURRENT_LIST_DIR}/Dynamics/Joints/b2MouseJoint.cpp
${CMAKE_CURRENT_LIST_DIR}/Dynamics/Joints/b2PrismaticJoint.cpp
${CMAKE_CURRENT_LIST_DIR}/Dynamics/Joints/b2PulleyJoint.cpp
${CMAKE_CURRENT_LIST_DIR}/Dynamics/Joints/b2RevoluteJoint.cpp
${CMAKE_CURRENT_LIST_DIR}/Dynamics/Joints/b2RopeJoint.cpp
${CMAKE_CURRENT_LIST_DIR}/Dynamics/Joints/b2WeldJoint.cpp
${CMAKE_CURRENT_LIST_DIR}/Dynamics/Joints/b2WheelJoint.cpp
)
set(BOX2D_Joints_HDRS
${CMAKE_CURRENT_LIST_DIR}/include/Box2D/Dynamics/Joints/b2DistanceJoint.h
${CMAKE_CURRENT_LIST_DIR}/include/Box2D/Dynamics/Joints/b2FrictionJoint.h
${CMAKE_CURRENT_LIST_DIR}/include/Box2D/Dynamics/Joints/b2GearJoint.h
${CMAKE_CURRENT_LIST_DIR}/include/Box2D/Dynamics/Joints/b2Joint.h
${CMAKE_CURRENT_LIST_DIR}/include/Box2D/Dynamics/Joints/b2MotorJoint.h
${CMAKE_CURRENT_LIST_DIR}/include/Box2D/Dynamics/Joints/b2MouseJoint.h
${CMAKE_CURRENT_LIST_DIR}/include/Box2D/Dynamics/Joints/b2PrismaticJoint.h
${CMAKE_CURRENT_LIST_DIR}/include/Box2D/Dynamics/Joints/b2PulleyJoint.h
${CMAKE_CURRENT_LIST_DIR}/include/Box2D/Dynamics/Joints/b2RevoluteJoint.h
${CMAKE_CURRENT_LIST_DIR}/include/Box2D/Dynamics/Joints/b2RopeJoint.h
${CMAKE_CURRENT_LIST_DIR}/include/Box2D/Dynamics/Joints/b2WeldJoint.h
${CMAKE_CURRENT_LIST_DIR}/include/Box2D/Dynamics/Joints/b2WheelJoint.h
)
set(BOX2D_Rope_SRCS
${CMAKE_CURRENT_LIST_DIR}/Rope/b2Rope.cpp
)
set(BOX2D_Rope_HDRS
${CMAKE_CURRENT_LIST_DIR}/include/Box2D/Rope/b2Rope.h
)
set(BOX2D_General_HDRS
${CMAKE_CURRENT_LIST_DIR}/include/Box2D/Box2D.h
)
if(BOX2D_BUILD_SHARED)
message("Box2D shared")
add_library(Box2D_shared SHARED
${BOX2D_General_HDRS}
${BOX2D_Joints_SRCS}
${BOX2D_Joints_HDRS}
${BOX2D_Contacts_SRCS}
${BOX2D_Contacts_HDRS}
${BOX2D_Dynamics_SRCS}
${BOX2D_Dynamics_HDRS}
${BOX2D_Common_SRCS}
${BOX2D_Common_HDRS}
${BOX2D_Shapes_SRCS}
${BOX2D_Shapes_HDRS}
${BOX2D_Collision_SRCS}
${BOX2D_Collision_HDRS}
${BOX2D_Rope_SRCS}
${BOX2D_Rope_HDRS}
)
set_target_properties(Box2D_shared PROPERTIES
OUTPUT_NAME "Box2D"
CLEAN_DIRECT_OUTPUT 1
VERSION ${BOX2D_VERSION}
)
set_target_properties(Box2D_shared PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_LIST_DIR}/include"
)
endif()
if(BOX2D_BUILD_STATIC)
message("Box2D static")
add_library(Box2D STATIC
${BOX2D_General_HDRS}
${BOX2D_Joints_SRCS}
${BOX2D_Joints_HDRS}
${BOX2D_Contacts_SRCS}
${BOX2D_Contacts_HDRS}
${BOX2D_Dynamics_SRCS}
${BOX2D_Dynamics_HDRS}
${BOX2D_Common_SRCS}
${BOX2D_Common_HDRS}
${BOX2D_Shapes_SRCS}
${BOX2D_Shapes_HDRS}
${BOX2D_Collision_SRCS}
${BOX2D_Collision_HDRS}
${BOX2D_Rope_SRCS}
${BOX2D_Rope_HDRS}
)
set_target_properties(Box2D PROPERTIES
CLEAN_DIRECT_OUTPUT 1
VERSION ${BOX2D_VERSION}
)
set_target_properties(Box2D PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_LIST_DIR}/include"
)
target_include_directories(Box2D PUBLIC ${CMAKE_CURRENT_LIST_DIR}/include)
endif()
# These are used to create visual studio folders.
source_group(Collision FILES ${BOX2D_Collision_SRCS} ${BOX2D_Collision_HDRS})
source_group(Collision\\Shapes FILES ${BOX2D_Shapes_SRCS} ${BOX2D_Shapes_HDRS})
source_group(Common FILES ${BOX2D_Common_SRCS} ${BOX2D_Common_HDRS})
source_group(Dynamics FILES ${BOX2D_Dynamics_SRCS} ${BOX2D_Dynamics_HDRS})
source_group(Dynamics\\Contacts FILES ${BOX2D_Contacts_SRCS} ${BOX2D_Contacts_HDRS})
source_group(Dynamics\\Joints FILES ${BOX2D_Joints_SRCS} ${BOX2D_Joints_HDRS})
source_group(Include FILES ${BOX2D_General_HDRS})
source_group(Rope FILES ${BOX2D_Rope_SRCS} ${BOX2D_Rope_HDRS})
A few screenshots of the folder structure in [gamename]/external/Box2D
:
Ohh Okay. Thanks for your help. I will apply those changes and then tell if it works for me.
R101
September 4, 2020, 6:08pm
#8
Everything posted above is from one of my projects, so there is no reason it shouldn’t work for you.
Okay. I will apply those changes.
R101
September 4, 2020, 6:33pm
#10
Is there any good reason to support x86/x86_64 for Android? x86 devices have a tiny segment of the market. You can save yourself a lot of time by avoiding x86/x86_64, assuming you don’t have a specific reason to support them.
No, actually I add them because of this.
R101:
by avoiding x86/x86_64
can you please tell me how to avoid them because, I reverted those abiFilters lines as default but it was showing same error even after that
R101
September 5, 2020, 2:14am
#12
You should be setting them in gradle.properties
:
# List of CPU Archtexture to build that application with
# Available architextures (armeabi-v7a | arm64-v8a | x86)
# To build for multiple architexture, use the `:` between them
# Example - PROP_APP_ABI=armeabi-v7a:arm64-v8a:x86
PROP_APP_ABI=armeabi-v7a:arm64-v8a
The gradle.properties
would have been generated with your new project. A text search for PROP_APP_ABI
across your project files would have shown you that in the results.
Hey @R101 Thank you for your help. Both methods work for me.
I applied it on another project and it works
system
closed
September 6, 2020, 10:45am
#14
This topic was automatically closed 24 hours after the last reply. New replies are no longer allowed.