凉白开 2017-03-21
以下只是自己的一些总结,欢迎讨论
通过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、adbpush与adbinstall区别
adbpush能够指定安装目录。比如执行"adbpushxxx.apksystem/app"后,xxx.apk被安装到了system/app目录下。这时候就是系统应用
adbinstall用此命令安装的软件位于data/app目录,则为userapplication。
4、当我们修改系统应用中的jni文件,你刷机后,系统的system/lib下就有你需要的so文件了。如果你不想刷机,你也可以通过adbpush*.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中最后加上
#Usethefolloingincludetomakeourtestapk.
include$(callall-makefiles-under,$(LOCAL_PATH))
会将当前工程目录所有子目录中的Android.mk进行编译