Как упаковать образец Android NDK?

Это общий вопрос, но я не могу найти подобных вопросов в stackoverflow, в которых обсуждается решение этой проблемы для последней версии для Android SDK / NDK.

Моя цель - упаковать Android NDK в виде файла apk.

So:

  1. Я установил Android NDK в каталог / opt - назвал его / opt /.
  2. И cd / opt // samples / где любой пример.
  3. Затем введите "/ opt // ndk-build", все скомпилировано правильно:
/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. Для упаковки в APK я использовал "ant", поэтому сначала сгенерируйте build.xml:

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

  1. "отладка муравья"

    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

Как побороть указанные выше ошибки компиляции?

Спасибо.


person Peter Teoh    schedule 20.04.2015    source источник


Ответы (1)


Во-первых, похоже, что вы создали "родную" часть hello-jni, а затем собрали и упаковали hello-gl2. Это два разных образца. Не могли бы вы убедиться, что вы остались в той же папке с образцами?

Я также настоятельно рекомендую вам добавить /opt/android-ndk-r10e, /opt/android-sdk-linux/tools и /opt/android-sdk-linux/platform-tools в переменную среды PATH. Просто добавьте эту строку в свой ~/.profile, а затем перезапустите терминал.

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

таким образом вы сможете получить доступ к любым инструментам Android, таким как ndk-build, adb и android, без необходимости указывать их абсолютные пути.

Если это не помогает, попробуйте очистить и восстановить образец с помощью ant clean && ant debug. Если это не сработает, попробуйте удалить следующее:

  • bin /
  • gen /
  • библиотеки /
  • obj /
  • build.xml
  • local.properties
  • proguard-project.xml

а затем попробуйте еще раз:

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

Все должно работать. Если по-прежнему не работает, я бы посоветовал запустить android (без параметров), чтобы запустить Android SDK Manager. Убедитесь, что у вас установлена ​​последняя версия, и убедитесь, что у вас установлена ​​платформа SDK для уровня API 21, если это уровень API, который вы хотите использовать. Последняя версия Android SDK Tools на сегодняшний день должна иметь версию 24.2. Убедитесь, что у вас установлена ​​последняя версия android-ndk. Последней на сегодняшний день должен быть r10e.

Удачи!

person mchiasson    schedule 18.05.2015