Android源码环境下编译自带JNI的APP
2017-08-10 17:28
579 查看
在eclipse或者Android Studio下可以通过NDK实现JNI的编译生成so库文件,那么在Android系统环境下,我们应该怎么做?直接使用eclipse或者AS的配置?NO,NO,NO 我们需要在项目的根目录下编写一个Android.mk文件如下:
Android.mk
几个重要的属性(源码编译JNI时容易遇到的几个坑):
- LOCAL_JNI_SHARED_LIBRARIES := libxxx 编译的时候,NDK自动会把这个libxxx打包进apk;放在
- LOCAL_REQUIRED_MODULES := libxxx 指定模块运行所依赖的模块(模块安装时将会同步安装它所依赖的模块),这里就是将我们的jni下对应的so库安装到system/lib/目录下,要不然APP运行时会找不到so库
- LOCAL_PROGUARD_ENABLED := disabled 不容许混淆,要不然我们通过jni反射java类的方法时,会找不到方法
下面是在jni目录下的Android.mk
jni/Android.mk
几个重要的属性:
LOCAL_LDLIBS := -lm -llog 链接的库不产生依赖关系,一般用于不需要重新编译的库,如库不存在,则会报错找不到。(eclipse和AS使用的方式)
LOCAL_SHARED_LIBRARIES := liblog libcutils libandroid_runtime libnativehelper libbinder 会生成依赖关系,当库不存在时会去编译这些库。(源码编译使用的方式)
Android.mk
LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE_TAGS := optional LOCAL_CERTIFICATE := platform LOCAL_STATIC_JAVA_LIBRARIES := android-support-v4 LOCAL_SRC_FILES := $(call all-java-files-under, src) \ $(call all-renderscript-files-under, src) \ LOCAL_JAVA_LIBRARIES := LOCAL_PACKAGE_NAME := XXX LOCAL_JNI_SHARED_LIBRARIES := libxxx LOCAL_REQUIRED_MODULES := libxxx LOCAL_PROGUARD_ENABLED := disabled include $(BUILD_PACKAGE) include $(call all-makefiles-under,$(LOCAL_PATH))
几个重要的属性(源码编译JNI时容易遇到的几个坑):
- LOCAL_JNI_SHARED_LIBRARIES := libxxx 编译的时候,NDK自动会把这个libxxx打包进apk;放在
yourapk/lib/<arch>/目录下
- LOCAL_REQUIRED_MODULES := libxxx 指定模块运行所依赖的模块(模块安装时将会同步安装它所依赖的模块),这里就是将我们的jni下对应的so库安装到system/lib/目录下,要不然APP运行时会找不到so库
- LOCAL_PROGUARD_ENABLED := disabled 不容许混淆,要不然我们通过jni反射java类的方法时,会找不到方法
下面是在jni目录下的Android.mk
jni/Android.mk
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE_TAGS := optional LOCAL_MODULE := libxxx LOCAL_SRC_FILES := Xxx.cpp LOCAL_SHARED_LIBRARIES := LOCAL_STATIC_LIBRARIES := LOCAL_C_INCLUDES += $(JNI_H_INCLUDE) LOCAL_CFLAGS += LOCAL_LDLIBS := -lm -llog LOCAL_SHARED_LIBRARIES := liblog libcutils libandroid_runtime libnativehelper libbinder LOCAL_PRELINK_MODULE := false include $(BUILD_SHARED_LIBRARY)
几个重要的属性:
LOCAL_LDLIBS := -lm -llog 链接的库不产生依赖关系,一般用于不需要重新编译的库,如库不存在,则会报错找不到。(eclipse和AS使用的方式)
LOCAL_SHARED_LIBRARIES := liblog libcutils libandroid_runtime libnativehelper libbinder 会生成依赖关系,当库不存在时会去编译这些库。(源码编译使用的方式)
development/samples/SimpleJNI该目录下有Android系统提供的JNI编译规则的简单样例可以参考。
相关文章推荐
- Android:源码环境编译自定义的APP到ROM(System Image)中
- 在Android源码环境下编译系统App使用第三方jar包的方法(备忘)
- Android:源码环境编译自定义的APP到ROM(System Image)中
- Android:源码环境编译自定义的APP到ROM(System Image)中
- Android NDK&&JNI 编译环境的搭建
- Android介绍以及源码编译---Ubuntu系统Android编译环境配置
- 通过mk文件编译android4.0.3系统app源码后覆盖安装失败解决办法(android odex文件)
- Android 4.3源码的下载和编译环境的安装及编译
- 在Android上实现SPI通信之(1)------在Ubuntu12.04环境下编译android源码
- Freescale I.mx 6 Android 4.2.2源码编译环境搭建(基于ubuntu12.04 LTS)
- Linux Mint 13 的安装、配置及搭建Android源码编译环境
- Android 5.1源码编译环境搭建
- Android 源码环境搭建及编译
- Android环境搭建3 编译Android源码
- 搭建arm-linux-gcc交叉编译工具链环境(Android原生(JNI)开发环境搭建)
- Mac环境下载编译Android源码方法记录
- 用gradlew编译打包的app,如何添加进Android源码做build
- android源码环境内置已编译好的模块apk_so_jar_bin
- 解读android源码APP之一 ---- 环境设置
- Freescale I.mx 6 Android 4.2.2源码编译环境搭建(基于ubuntu12.04 LTS)