【问题标题】:How to package Android NDK's sample?如何打包 Android NDK 的示例?
【发布时间】:2015-06-27 06:15:10
【问题描述】:

这是一个通用问题,但我在 stackoverflow 中找不到任何类似的问题来讨论 Android SDK/NDK 最新版本的解决方案。

我的目的是将 Android NDK 打包为 apk 文件。

所以:

  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] 编译:hello-jni libs/arm64-v8a/libhello-jni.so [x86_64] 编译:hello-jni libs/x86_64/libhello-jni.so [mips64] 编译:hello-jni libs/mips64/libhello-jni.so [armeabi-v7a] 编译拇指:hello-jni libs/armeabi-v7a/libhello-jni.so [armeabi] 编译拇指:hello-jni libs/armeabi/libhello-jni.so [x86] 编译:hello-jni libs/x86/libhello-jni.so [mips] 编译:hello-jni libs/mips/libhello-jni.so
  1. 打包成APK,我用的是“ant”,所以先生成build.xml:

/opt/android-sdk-linux/tools/android 更新项目 --path 。 --target android-21

  1. “蚂蚁调试”
构建文件:/opt/android-ndk/samples/hello-gl2/build.xml -设置模式检查: -设置调试文件: -检查环境: [checkenv] Android SDK 工具修订版 24.1.2 [checkenv] 安装在 /opt/android-sdk-linux -设置: [echo] 项目名称:GL2JNIActivity [gettype] 项目类型:应用程序 -设置调试模式: -调试混淆检查: -预构建: -构建设置: [getbuildtools] 使用最新的构建工具:22.0.1 [echo] 正在解析 GL2JNIActivity 的构建目标... [gettarget] 项目目标:Android 5.0.1 [gettarget] API 级别:21 [回声] ---------- [echo] 如果需要,创建输出目录... [mkdir] 创建目录:/opt/android-ndk/samples/hello-gl2/bin/rsObj [mkdir] 创建目录:/opt/android-ndk/samples/hello-gl2/bin/rsLibs [回声] ---------- [echo] 解决 GL2JNIActivity 的依赖关系... [依赖] 库依赖: [依赖] 没有库 [依赖] [依赖] ------------------ [回声] ---------- [echo] 使用“调试”构建库... [subant] 没有要迭代的子构建 -代码生成: [mergemanifest] AndroidManifest 文件没有变化。 [echo] 处理aidl文件... [aidl] 没有要编译的 AIDL 文件。 [回声] ---------- [echo] 处理 RenderScript 文件... [回声] ---------- [回声] 处理资源... [aapt] 没有更改的资源。 R.java 和 Manifest.java 保持不变。 [回声] ---------- [echo] 处理 BuildConfig 类... [buildconfig] 生成 BuildConfig 类。 -预编译: -编译: [javac] 编译6个源文件到/opt/android-ndk/samples/hello-gl2/bin/classes -编译后: - 混淆: -索引: [dex] 输入:/opt/android-ndk/samples/hello-gl2/bin/classes [dex] 找到修改过的输入文件 [dex] 将编译后的文件和外部库转换成/opt/android-ndk/samples/hello-gl2/bin/classes.dex... -紧缩: [紧缩] 在源目录中处理 PNG 文件:/opt/android-ndk/samples/hello-gl2/res [紧缩]到目标目录:/opt/android-ndk/samples/hello-gl2/bin/res [crunch] 压缩 0 个 PNG 文件以更新缓存 -包资源: [aapt] 正在创建完整的资源包... 包裹: [apkbuilder] 当前构建类型与以前的构建不同:强制 apkbuilder 运行。 [apkbuilder] 创建 GL2JNIActivity-debug-unaligned.apk 并使用调试密钥对其进行签名... [apkbuilder] 找到 APK 的重复文件:AndroidManifest.xml [apkbuilder] 来源1:/opt/android-ndk/samples/hello-gl2/bin/GL2JNIActivity.ap_ [apkbuilder] 来源 2:/opt/android-ndk/samples/hello-gl2/AndroidManifest.xml 构建失败 /opt/android-sdk-linux/tools/ant/build.xml:963:执行此行时出现以下错误: /opt/android-sdk-linux/tools/ant/build.xml:974:执行此行时出现以下错误: /opt/android-sdk-linux/tools/ant/build.xml:313: com.android.sdklib.build.DuplicateFileException: APK 内相同路径的重复文件 在 com.android.sdklib.build.ApkBuilder.doAddFile(ApkBuilder.java:821) 在 com.android.sdklib.build.ApkBuilder.addFile(ApkBuilder.java:507) 在 com.android.sdklib.build.ApkBuilder.processFileForResource(ApkBuilder.java:872) 在 com.android.sdklib.build.ApkBuilder.addSourceFolder(ApkBuilder.java:623) 在 com.android.sdklib.build.ApkBuilder.addSourceFolder(ApkBuilder.java:605) 在 com.android.ant.ApkBuilderTask.execute(ApkBuilderTask.java:356) 在 org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:292) 在 sun.reflect.GeneratedMethodAccessor4.invoke(未知来源) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:606) 在 org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) 在 org.apache.tools.ant.Task.perform(Task.java:348) 在 org.apache.tools.ant.taskdefs.Sequential.execute(Sequential.java:68) 在 org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:292) 在 sun.reflect.GeneratedMethodAccessor4.invoke(未知来源) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:606) 在 org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) 在 org.apache.tools.ant.Task.perform(Task.java:348) 在 org.apache.tools.ant.taskdefs.MacroInstance.execute(MacroInstance.java:396) 在 org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:292) 在 sun.reflect.GeneratedMethodAccessor4.invoke(未知来源) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:606) 在 org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) 在 org.apache.tools.ant.Task.perform(Task.java:348) 在 org.apache.tools.ant.taskdefs.Sequential.execute(Sequential.java:68) 在 com.android.ant.IfElseTask.execute(IfElseTask.java:124) 在 org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:292) 在 sun.reflect.GeneratedMethodAccessor4.invoke(未知来源) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:606) 在 org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) 在 org.apache.tools.ant.Task.perform(Task.java:348) 在 org.apache.tools.ant.taskdefs.Sequential.execute(Sequential.java:68) 在 com.android.ant.IfElseTask.execute(IfElseTask.java:124) 在 org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:292) 在 sun.reflect.GeneratedMethodAccessor4.invoke(未知来源) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:606) 在 org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) 在 org.apache.tools.ant.Task.perform(Task.java:348) 在 org.apache.tools.ant.taskdefs.Sequential.execute(Sequential.java:68) 在 org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:292) 在 sun.reflect.GeneratedMethodAccessor4.invoke(未知来源) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:606) 在 org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) 在 org.apache.tools.ant.Task.perform(Task.java:348) 在 org.apache.tools.ant.taskdefs.MacroInstance.execute(MacroInstance.java:396) 在 org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:292) 在 sun.reflect.GeneratedMethodAccessor4.invoke(未知来源) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:606) 在 org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) 在 org.apache.tools.ant.Task.perform(Task.java:348) 在 org.apache.tools.ant.Target.execute(Target.java:435) 在 org.apache.tools.ant.Target.performTasks(Target.java:456) 在 org.apache.tools.ant.Project.executeSortedTargets(Project.java:1393) 在 org.apache.tools.ant.Project.executeTarget(Project.java:1364) 在 org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41) 在 org.apache.tools.ant.Project.executeTargets(Project.java:1248) 在 org.apache.tools.ant.Main.runBuild(Main.java:851) 在 org.apache.tools.ant.Main.startAnt(Main.java:235) 在 org.apache.tools.ant.launch.Launcher.run(Launcher.java:280) 在 org.apache.tools.ant.launch.Launcher.main(Launcher.java:109) 总时间:2秒

如何克服上述编译错误?

谢谢。

【问题讨论】:

    标签: android ant android-ndk android-sdk-tools


    【解决方案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-buildadbandroid,而无需指定它们的绝对路径。

    如果这没有帮助,请尝试使用ant clean && ant debug 清理并重建您的样本。如果这不起作用,请尝试删除以下内容:

    • bin/
    • gen/
    • 库/
    • 对象/
    • 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。确保您是最新的,如果您想要使用 API 级别,请确保您已安装 API 级别 21 的 SDK 平台。截至今天,最新的 Android SDK 工具应该是 24.2 版。确保你也有最新的 android-ndk。今天最新的应该是 r10e。

    祝你好运!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-21
      • 1970-01-01
      相关资源
      最近更新 更多