为JNI应用程序设置Android构建环境

时间:2012-11-15 15:41:51

标签: android android-ndk java-native-interface installation build-environment

我有一个专有的JNI应用程序,我需要为MIPS设备构建。我已经阅读了"Initializing a Build Environment",部分NDK文档,一些Google网上论坛帖子以及众多StackOverflow问题,但我仍然缺少答案。

到目前为止,我已使用Google的repo脚本检查了Android源代码并将其保存在~/AndroidSource下。我还单独下载了~/AndroidSDK下的SDK和~/AndroidNDK下的NDK。我正在尝试构建的代码位于一个单独的位置。 SDK和NDK二进制文件在我的路径中。对于构建,我尝试使用两个不同版本的NDK以及Android源代码树下的一个版本,并遇到了不同的问题集。我目前的设置使用NDK r8b,与Android源分开下载。

该应用程序有Android.mkjni/Android.mk。但是,后者的几个指令指向诸如

之类的路径
frameworks/base/include
system/core/include

没有前缀。我认为这些是指向Android源中的相应目录,因此我将它们符号链接到当前目录。经过一些更多的符号链接和makefile以及源代码黑客攻击之后,我得到了应用程序进行编译,但我目前仍处于链接阶段,其中包含许多对缺少方法体的引用。在整个过程中,我知道我做错了什么。

我在Linux x86_64主机上,如果它有任何问题。

所以我的问题是:

为JNI应用程序设置构建环境的正确方法是什么?我应该设置哪些环境变量,符号链接和/或路径扩展?我需要在每次ndk-build调用之前或之前调用任何脚本吗?

另外,如果你纠正了我错误的任何概念或术语,我会很高兴。

2 个答案:

答案 0 :(得分:1)

我在构建中使用以下内容(YMMV)。

  • 显式调用arm-linux-androideabi-gcc作为编译器或链接器(应位于PATH中)。
  • NDK_PLATFORM = /路径/到/机器人-NDK-R * /平台/机器人-14
  • -I"$(NDK_PLATFORM)/arch-arm/usr/include"传递给编译器
  • -nostdlib -L"$(NDK_PLATFORM)/arch-arm/usr/lib/" -lgcc -lc -lm传递给链接器

答案 1 :(得分:1)

您的方法是将系统标题的AOSP树符号链接正确。您现在需要的是为MIPS编译的系统库。获取它们的最简单方法是从目标设备(或模拟器映像)adb pull获取它们。但您也可以自己构建这些库,作为AOSP构建的一部分(请参阅您下载的源代码树的构建说明)。

如果您仍然遇到任何问题,请使用参数ndk-build运行V=1并发布链接命令及其结果。