打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Android程序编译原理之浅析(NDK编译)

Android build/core下的编译脚本里会用到变量NDK_ROOT和NDK_PROJECT_PATH。但是这两个变量你都不是必须显式地设置对应环境变量。因为如果没有定义NDK_ROOT,脚本里拿字符串"build/core"去匹配当前脚本的全路径,截取该字符串前面的部分即是NDK_ROOT了。如果定义了NDK_PROJECT_PATH,则脚本会在该路径下去找jni目录下的 application.mk 和 android.mk;如果没有定义NDK_PROJECT_PATH,则脚本会查找"jni/Android.mk"来匹配得到NDK_PROJECT_PATH,然后在NDK_PROJECT_PATH目录下找到application.mk 和 android.mk。如果application.mk中的APP_BUILD_SCRIPT没有指定Android.mk的路径,则在application.mk当前所在的目录下找Android.mk;否则的话,就直接根据APP_BUILD_SCRIPT来找Android.mk。

Android下面编译程序,除了Android.mk之外, Application.mk也是必须要的。 通过查看buid/core/build-local.mk可知道,如果你没有写Application.mk,它会默认地使用build/core/default-application.mk,然后根据其中的APP_BUILD_SCRIPT调用Android.mk去编译.所以,如果刚好你不需要在Application.mk中去指定cpu的架构等信息,没有写Application.mk你也能正确编译。

Application.mk 中的APP_BUILD_SCRIPT是个可选的变量,可以根据需要来决定是否设置具体的值。正因为这个特性,我们可以根据Application.mk的位置分为$Project/jni/ 和 $NDK_ROOT/jni/中两种情况。

如果没有指定环境变量NDK_PROJECT_PATH,编译器会在当前执行编译命令的目录下通过匹配jni/Android.mk的方式来得到NDK_PROJECT_PATH。所以执行的时候只能在$Project当前应用程序的目录下执行$NDK_ROOT/ndk-build来编译。

Application.mk可以和Android.mk一起放在你的$Project/jni/目录下,如果Application.mk中没有指定APP_BUILD_SCRIPT变量的值,编译器会自动在make的当前目录下的jni目录下去找Android.mk. 如果Application.mk中指定了APP_BUILD_SCRIPT变量的值,则编译器会按照此变量的值去读Android.mk.所以。一般对于Application.mk和Android.mk都在$Project/jni/目录下的情况,我们没有必要在Application.mk中指定APP_BUILD_SCRIPT,直接让编译器读取$Project/jni/目录下的Android.mk就可以了。

对于Application.mk在$NDK_ROOT/jni/下的情况,则必须要指定APP_BUILD_SCRIPT,APP_PROJECT_PATH也是可选的,同时必须要指定环境变量NDK_PROJECT_PATH---编译器根据此环境变量找到$NDK_ROOT/jni/Application.mk。

注意APP_PROJECT_PATH对于"$PROJECT/jni/Application.mk"文件是可选的,但对于"$NDK/apps/<myapp>/Application.mk"是强制需要的。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Linux Android NDK
ubuntu9.10安装android SDK - 日志 - wuhua0904 - LUPA开源社区 - Powered by LUPA
Using C++ OpenCV code with Android binary package
Android 源代码中增加新apk
在android studio中集成javah, ndk
Unity与 SO 交互 ☀️| 详细讲解 怎样通过 Android Studio 生成一个.so文件 并简单调用!
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服