如何在没有jni目录的情况下使用ndk-build?

时间:2015-12-06 02:56:14

标签: android android-ndk java-native-interface

我们正在尝试将Android的第一类构建支持添加到C ++库中。我们希望提供库存Android.mk,并从Eclipse或Android Studio项目目录中的jni子文件夹等依赖项中删除它。也就是说,我们希望:

cd library-src
ndk-build <options>

在上文中,library-src 不是 NDK_PROJECT_PATH。相反,它是库的根文件夹。

我们访问了NDK的帮助(ndk-build -?),但它没有告诉我们如何删除这些假设。我们尝试了以下方法,但它产生了错误:

$ ndk-build -f Android.mk
Android NDK: Could not find application project directory !    
Android NDK: Please define the NDK_PROJECT_PATH variable to point to it.    
/opt/android-ndk-r10e/build/core/build-local.mk:143: *** Android NDK: Aborting
Stop.

尝试设置NDK_PROJECT_PATH会导致类似的错误:

$ NDK_PROJECT_PATH=. ndk-build -f Android.mk
Android NDK: Your APP_BUILD_SCRIPT points to an unknown file: ./jni/Android.mk    
/opt/android-ndk-r10e/.../add-application.mk:199: *** Android NDK: Aborting...
Stop.

尝试设置APP_BUILD_SCRIPT会导致类似的错误:

$ NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=Android.mk ndk-build -f Android.mk
Android NDK: Your APP_BUILD_SCRIPT points to an unknown file: ./jni/Android.mk    
/opt/android-ndk-r10e/.../add-application.mk:199: *** Android NDK: Aborting...
Stop.

我们如何在没有jni目录的情况下使用ndk-build?

重要的是我们删除了限制/假设。如果我们无法删除它们,那么我们就无法自动构建和测试。如果我们无法自动构建和测试,那么我们就无法添加支持,因为我们的治理具有一些我们无法通过的QA和测试门。 (我愿意容忍手册adb push来测试设备上的内容。)

1 个答案:

答案 0 :(得分:0)

我必须承认我不明白你的局限性。为什么添加文件library-src/Android.mk没问题,但library-src/jni/Android.mk会破坏您的质量保证和测试门。此外, Android.mk 通常不足以启动构建。无论您是要选择STL变体,还是选择ABI或工具链,都可以在不同的文件 Application.mk 中定义这些设置,这也是 jni 按惯例的目录。添加 library-src / jni 目录,Android开发人员会感谢他们的交易工具升级并且可以使用标准配置。

但Android构建是一个非常灵活的系统,你可以实现你所要求的字面意思。

你做的实验没有用,因为 ndk-build 只是一个围绕GNU make的瘦包装,并且处理低优先级的环境变量。

ndk-build APP_BUILD_SCRIPT=Android.mk NDK_PROJECT_PATH=.

很可能只是为你工作。如果您需要更多控制权,可以使用类似

的内容
ndk-build APP_BUILD_SCRIPT=Android.mk NDK_PROJECT_PATH=. APP_STL=gnustl_static APP_ABI=armeabi-v7a APP_PLATFORM=android-19 NDK_TOOLCHAIN_VERSION=4.9

您也可以控制输出目录。请参阅 NDK_APP_OUT NDK_APP_LIBS_OUT

最后一个提示:如果您的全局构建过程基于 make ,则可以直接调用 $(MAKE),而不是通过 ndk-build < / strong>即可。如果您需要standalone toolchain来保持与平台无关的 make 逻辑,也可以。