Android源码环境下编译自带JNI的APP

来源:互联网 发布:粮食进出口贸易数据 编辑:程序博客网 时间:2024/05/19 13:42

在eclipse或者Android Studio下可以通过NDK实现JNI的编译生成so库文件,那么在Android系统环境下,我们应该怎么做?直接使用eclipse或者AS的配置?NO,NO,NO 我们需要在项目的根目录下编写一个Android.mk文件如下:

Android.mk

LOCAL_PATH:= $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE_TAGS := optionalLOCAL_CERTIFICATE := platformLOCAL_STATIC_JAVA_LIBRARIES := android-support-v4LOCAL_SRC_FILES := $(call all-java-files-under, src) \                $(call all-renderscript-files-under, src) \LOCAL_JAVA_LIBRARIES :=LOCAL_PACKAGE_NAME := XXXLOCAL_JNI_SHARED_LIBRARIES := libxxxLOCAL_REQUIRED_MODULES := libxxxLOCAL_PROGUARD_ENABLED := disabledinclude $(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 := optionalLOCAL_MODULE    := libxxxLOCAL_SRC_FILES := Xxx.cppLOCAL_SHARED_LIBRARIES :=LOCAL_STATIC_LIBRARIES :=LOCAL_C_INCLUDES += $(JNI_H_INCLUDE)LOCAL_CFLAGS +=LOCAL_LDLIBS := -lm -llogLOCAL_SHARED_LIBRARIES := liblog libcutils libandroid_runtime libnativehelper libbinderLOCAL_PRELINK_MODULE := falseinclude $(BUILD_SHARED_LIBRARY)

几个重要的属性:
LOCAL_LDLIBS := -lm -llog 链接的库不产生依赖关系,一般用于不需要重新编译的库,如库不存在,则会报错找不到。(eclipse和AS使用的方式)
LOCAL_SHARED_LIBRARIES := liblog libcutils libandroid_runtime libnativehelper libbinder 会生成依赖关系,当库不存在时会去编译这些库。(源码编译使用的方式)

development/samples/SimpleJNI该目录下有Android系统提供的JNI编译规则的简单样例可以参考。

原创粉丝点击