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

在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 := 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//目录下
- 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,jni)