以下只是自己的一些总结,欢迎讨论
通过NDK编译jni网上有很多例子,在这我只总结在Android源码下编译
1、android源码环境下编译so包,编出来的.so的包前面不会自动给添加lib,NDK编译会自动给添加lib,即使Android.mk文件里面LOCAL_MODULE :=名字前面没有lib,NDK也会自动给你添加lib. 所以NDK编译时Android.mk文件编译出来的so包名字可以加lib也可不加,但源码下编译必须加
2、系统应用和用户应用的区别
在package/app下的工程 编译后生成的apk都会在system/app下 将系统 烧录到手机后 这些apk都会作为系统应用,系统应用所使用到的.so库全部在system/lib下面,若没有则会出错。这就是为什么源码下编译jni生成的库会放在out/target/product/xxxxxxxx_xx_m0/system/lib
用户应用会默认到应用的data/data目录的lib文件夹下找.so,如果找不到就会报错误。当前前提是你的系统system/lib下没有同样的so文件.
3、adb push 与 adb install 区别
adb push 能够指定安装目录。比如执行"adb push xxx.apk system/app" 后,xxx.apk被安装到了system/app目录下。 这时候就是系统应用
adb install 用此命令安装的软件位于 data/app 目录,则为user application。
4、当我们修改系统应用中的jni文件,你刷机后,系统的system/lib下就有你需要的so文件了。如果你不想刷机,你也可以通过adb push *.so \system\lib的方式,将*.so放到system\lib下,以供调用,因为不刷机系统中的system/lib下并没有刚才生成的.so
5、如果我们没有jni文件只有.so的话,系统应用因为需要在system/lib下调用.so,所有我们就需要在编译的时候将这个.so文件预置到out/target/product/xxxxxxxx_xx_m0/system/lib中
include $(CLEAR_VARS)
LOCAL_MODULE := libfp_gf_mp
LOCAL_SRC_FILES := ../libs/arm64-v8a/libfp_gf_mp.so
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_SUFFIX := .so
LOCAL_PROPRIETARY_MODULE := true
LOCAL_MODULE_CLASS := SHARED_LIBRARIES
include $(BUILD_PREBUILT)
6、直接使用.so 库 步骤
1、第三方的so文件或者别人编译好的so文件,你可以直接放到 libs/armeabi 下
2、在主文件夹的Android.mk中加上依赖 LOCAL_JNI_SHARED_LIBRARIES := libuserbookpatcher_jni
3 、如果是系统应用则要在jni的Android.mk中将.so文件预置到system/lib中
注:在程序中用jni文件生成.so不用进行预置,因为会直接生成到里面system/lib中 但是主文件夹的Android.mk中加上依赖 LOCAL_JNI_SHARED_LIBRARIES := libuserbookpatcher_jni
7、在工程目录的Android.mk中 最后加上
# Use the folloing include to make our test apk.
include $(call all-makefiles-under,$(LOCAL_PATH))
会将当前工程目录所有子目录中的Android.mk进行编译