在Android源码下编译jni所需要知道的事~

以下只是自己的一些总结,欢迎讨论

通过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进行编译

猜你喜欢

转载自592713711.iteye.com/blog/2364550