2012-11-15 39 views
0

我已经掌握了需要为MIPS设备构建的专有JNI应用程序。我读过"Initializing a Build Environment",部分NDK文档,一些Google网上论坛主题和众多StackOverflow问题,但我仍然没有回答。为JNI应用程序设置Android构建环境

到目前为止,我已经使用Google的回购脚本检出了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之前或之前调用任何脚本吗?

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

回答

1

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

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

+0

我认为链接问题与应用程序代码构建的库有关,而不是预先构建在设备上,但现在我无法测试。我不再在该应用程序上工作,并且我的本地Android源与其目标不匹配。然而,我正在寻找“正确的做法”的答案。 – mcmlxxxvi

+0

如果include路径中包含'frameworks/base/include'和'system/core/include',则很可能会有'-lutils'和'-lcutils'。这两个库实际上是无处不在的,但不是NDK附带的“稳定API”的一部分。 –

1

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

  • 明确调用arm-linux-androideabi-gcc作为您的编译器或链接器(应该在PATH中)。
  • NDK_PLATFORM = /路径/到/ Android的NDK-R * /平台/ Android的14
  • 通行证-I"$(NDK_PLATFORM)/arch-arm/usr/include"编译器
  • 通行证-nostdlib -L"$(NDK_PLATFORM)/arch-arm/usr/lib/" -lgcc -lc -lm到连接
+0

我宁愿不走你的路,但链接器标志看起来很有用 - 我会研究它们的未来版本。 – mcmlxxxvi

+0

@mcmlxxxvi:首先,请注意,您需要用'mipsel-linux-androideabi-gcc'替换'arm-linux-androideabi-gcc',用'arch-mips'替换'arch-asm'。其次,如果在项目中实际使用了这种方法,则无法弥补非公共标题和库的影响。第三,通常'ndk-build'通常会为编译器和链接器提供正确和一致的参数。 –

相关问题