0
votes

This is a generic question, but I cannot find any similar questions in stackoverflow that discuss the solution to this for recent version for Android SDK/NDK.

My purpose is to package the Android NDK as a apk file.

So:

  1. I installed Android NDK into /opt directory - called it /opt/.
  2. And cd /opt//samples/ where is any example.
  3. And then enter "/opt//ndk-build", it compiled alright:
/opt/android-ndk/ndk-build
[arm64-v8a] Gdbserver      : [aarch64-linux-android-4.9] libs/arm64-v8a/gdbserver
[arm64-v8a] Gdbsetup       : libs/arm64-v8a/gdb.setup
[x86_64] Gdbserver      : [x86_64-4.9] libs/x86_64/gdbserver
[x86_64] Gdbsetup       : libs/x86_64/gdb.setup
[mips64] Gdbserver      : [mips64el-linux-android-4.9] libs/mips64/gdbserver
[mips64] Gdbsetup       : libs/mips64/gdb.setup
[armeabi-v7a] Gdbserver      : [arm-linux-androideabi-4.8] libs/armeabi-v7a/gdbserver
[armeabi-v7a] Gdbsetup       : libs/armeabi-v7a/gdb.setup
[armeabi] Gdbserver      : [arm-linux-androideabi-4.8] libs/armeabi/gdbserver
[armeabi] Gdbsetup       : libs/armeabi/gdb.setup
[x86] Gdbserver      : [x86-4.8] libs/x86/gdbserver
[x86] Gdbsetup       : libs/x86/gdb.setup
[mips] Gdbserver      : [mipsel-linux-android-4.8] libs/mips/gdbserver
[mips] Gdbsetup       : libs/mips/gdb.setup
[arm64-v8a] Compile        : hello-jni  libs/arm64-v8a/libhello-jni.so
[x86_64] Compile        : hello-jni  libs/x86_64/libhello-jni.so
[mips64] Compile        : hello-jni  libs/mips64/libhello-jni.so
[armeabi-v7a] Compile thumb  : hello-jni  libs/armeabi-v7a/libhello-jni.so
[armeabi] Compile thumb  : hello-jni  libs/armeabi/libhello-jni.so
[x86] Compile        : hello-jni  libs/x86/libhello-jni.so
[mips] Compile        : hello-jni  libs/mips/libhello-jni.so
  1. To package into APK, I used "ant", so generate the build.xml first:

/opt/android-sdk-linux/tools/android update project --path . --target android-21

  1. "ant debug"

    Buildfile: /opt/android-ndk/samples/hello-gl2/build.xml

    -set-mode-check:

    -set-debug-files:

    -check-env:
     [checkenv] Android SDK Tools Revision 24.1.2
     [checkenv] Installed at /opt/android-sdk-linux

    -setup:
         [echo] Project Name: GL2JNIActivity
      [gettype] Project Type: Application

    -set-debug-mode:

    -debug-obfuscation-check:

    -pre-build:

    -build-setup:
    [getbuildtools] Using latest Build Tools: 22.0.1
         [echo] Resolving Build Target for GL2JNIActivity...
    [gettarget] Project Target:   Android 5.0.1
    [gettarget] API level:        21
         [echo] ----------
         [echo] Creating output directories if needed...
        [mkdir] Created dir: /opt/android-ndk/samples/hello-gl2/bin/rsObj
        [mkdir] Created dir: /opt/android-ndk/samples/hello-gl2/bin/rsLibs
         [echo] ----------
         [echo] Resolving Dependencies for GL2JNIActivity...
    [dependency] Library dependencies:
    [dependency] No Libraries
    [dependency] 
    [dependency] ------------------
         [echo] ----------
         [echo] Building Libraries with 'debug'...
       [subant] No sub-builds to iterate on

    -code-gen:
    [mergemanifest] No changes in the AndroidManifest files.
         [echo] Handling aidl files...
         [aidl] No AIDL files to compile.
         [echo] ----------
         [echo] Handling RenderScript files...
         [echo] ----------
         [echo] Handling Resources...
         [aapt] No changed resources. R.java and Manifest.java untouched.
         [echo] ----------
         [echo] Handling BuildConfig class...
    [buildconfig] Generating BuildConfig class.

    -pre-compile:

    -compile:
        [javac] Compiling 6 source files to /opt/android-ndk/samples/hello-gl2/bin/classes

    -post-compile:

    -obfuscate:

    -dex:
          [dex] input: /opt/android-ndk/samples/hello-gl2/bin/classes
          [dex] Found modified input file
          [dex] Converting compiled files and external libraries into /opt/android-ndk/samples/hello-gl2/bin/classes.dex...

    -crunch:
       [crunch] Crunching PNG Files in source dir: /opt/android-ndk/samples/hello-gl2/res
       [crunch] To destination dir: /opt/android-ndk/samples/hello-gl2/bin/res
       [crunch] Crunched 0 PNG files to update cache

    -package-resources:
         [aapt] Creating full resource package...

    package:
    [apkbuilder] Current build type is different than previous build: forced apkbuilder run.
    [apkbuilder] Creating GL2JNIActivity-debug-unaligned.apk and signing it with a debug key...
    [apkbuilder] Found duplicate file for APK: AndroidManifest.xml
    [apkbuilder] Origin 1: /opt/android-ndk/samples/hello-gl2/bin/GL2JNIActivity.ap_
    [apkbuilder] Origin 2: /opt/android-ndk/samples/hello-gl2/AndroidManifest.xml

    BUILD FAILED
    /opt/android-sdk-linux/tools/ant/build.xml:963: The following error occurred while executing this line:
    /opt/android-sdk-linux/tools/ant/build.xml:974: The following error occurred while executing this line:
    /opt/android-sdk-linux/tools/ant/build.xml:313: com.android.sdklib.build.DuplicateFileException: Duplicate files at the same path inside the APK
        at com.android.sdklib.build.ApkBuilder.doAddFile(ApkBuilder.java:821)
        at com.android.sdklib.build.ApkBuilder.addFile(ApkBuilder.java:507)
        at com.android.sdklib.build.ApkBuilder.processFileForResource(ApkBuilder.java:872)
        at com.android.sdklib.build.ApkBuilder.addSourceFolder(ApkBuilder.java:623)
        at com.android.sdklib.build.ApkBuilder.addSourceFolder(ApkBuilder.java:605)
        at com.android.ant.ApkBuilderTask.execute(ApkBuilderTask.java:356)
        at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:292)
        at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
        at org.apache.tools.ant.Task.perform(Task.java:348)
        at org.apache.tools.ant.taskdefs.Sequential.execute(Sequential.java:68)
        at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:292)
        at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
        at org.apache.tools.ant.Task.perform(Task.java:348)
        at org.apache.tools.ant.taskdefs.MacroInstance.execute(MacroInstance.java:396)
        at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:292)
        at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
        at org.apache.tools.ant.Task.perform(Task.java:348)
        at org.apache.tools.ant.taskdefs.Sequential.execute(Sequential.java:68)
        at com.android.ant.IfElseTask.execute(IfElseTask.java:124)
        at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:292)
        at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
        at org.apache.tools.ant.Task.perform(Task.java:348)
        at org.apache.tools.ant.taskdefs.Sequential.execute(Sequential.java:68)
        at com.android.ant.IfElseTask.execute(IfElseTask.java:124)
        at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:292)
        at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
        at org.apache.tools.ant.Task.perform(Task.java:348)
        at org.apache.tools.ant.taskdefs.Sequential.execute(Sequential.java:68)
        at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:292)
        at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
        at org.apache.tools.ant.Task.perform(Task.java:348)
        at org.apache.tools.ant.taskdefs.MacroInstance.execute(MacroInstance.java:396)
        at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:292)
        at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
        at org.apache.tools.ant.Task.perform(Task.java:348)
        at org.apache.tools.ant.Target.execute(Target.java:435)
        at org.apache.tools.ant.Target.performTasks(Target.java:456)
        at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1393)
        at org.apache.tools.ant.Project.executeTarget(Project.java:1364)
        at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
        at org.apache.tools.ant.Project.executeTargets(Project.java:1248)
        at org.apache.tools.ant.Main.runBuild(Main.java:851)
        at org.apache.tools.ant.Main.startAnt(Main.java:235)
        at org.apache.tools.ant.launch.Launcher.run(Launcher.java:280)
        at org.apache.tools.ant.launch.Launcher.main(Launcher.java:109)

    Total time: 2 seconds

How to overcome the above compilation errors?

Thanks.

1

1 Answers

0
votes

First of all, it looks like you built the native side of hello-jni, and then built and packaged hello-gl2. These are two different samples. Could you please make sure you stay in the same sample folder?

I also highly recommend that you add /opt/android-ndk-r10e, /opt/android-sdk-linux/tools and /opt/android-sdk-linux/platform-tools to your PATH environment variable. Simply add this line to your ~/.profile and then restart your terminal.

export PATH=${PATH}:/opt/android-ndk-r10e;/opt/android-sdk-linux/tools:/opt/android-sdk-linux/platform-tools"

this way, you should be able to access any android tools such as ndk-build, adb and android without having to specify their absolute paths.

If that doesn't help, try cleaning up and rebuilding your sample with ant clean && ant debug. If that doesn't work, try deleting the following:

  • bin/
  • gen/
  • libs/
  • obj/
  • build.xml
  • local.properties
  • proguard-project.xml

and then try again:

ndk-build NDK_DEBUG=1
android update project --path . --target android-21
ant debug

Everything should work. If it still doesn't work, I would advise to launch android (with no parameters) to launch the Android SDK Manager. Make sure you are up to date, and make sure you have SDK Platform for API level 21 installed if that's the API level you want to use. The latest Android SDK Tools as of today should be revision 24.2. Make sure you have the latest android-ndk too. Latest as of today should be r10e.

Good luck!