Generating APK build error android studio

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.

Box2d is missing?

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 thereScreenshot (155)

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

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:

image

Ohh Okay. Thanks for your help. I will apply those changes and then tell if it works for me.

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.

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.

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

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 :hugs:

This topic was automatically closed 24 hours after the last reply. New replies are no longer allowed.