【问题标题】:How to package Android NDK's sample?如何打包 Android NDK 的示例?
【发布时间】:2015-06-27 06:15:10
【问题描述】:
这是一个通用问题,但我在 stackoverflow 中找不到任何类似的问题来讨论 Android SDK/NDK 最新版本的解决方案。
我的目的是将 Android NDK 打包为 apk 文件。
所以:
- 我将 Android NDK 安装到 /opt 目录 - 将其命名为 /opt/。
- 还有 cd /opt//samples/ 示例。
- 然后输入“/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
- 打包成APK,我用的是“ant”,所以先生成build.xml:
/opt/android-sdk-linux/tools/android 更新项目 --path 。 --target android-21
- “蚂蚁调试”
构建文件:/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