首页 > 代码库 > Android4.2.2NDK和源码开发jni的异同(2)

Android4.2.2NDK和源码开发jni的异同(2)

NDK开发Android.mk编写samples

1、jni中包含多个源文件,且多个文件编译成为不同的so文件

(1)jni/Android.mk:
include $(call all-subdir-makefiles)    (包含所有子目录下Android.mk)
注意:在写Android.mk文件时,
call all-subdir-makefiles和call all-makefiles-under,$(LOCAL_PATH)是有区别的。
前者表示“当前目录下没有需要编译的文件,请向子目录深入”,
是告诉编译器继续向目录深处递归的一种规定写法。
后者从字面上理解也应该是同一个意思。
但是,请考虑这样一种情况:如果当前目录下有文件需要编译,
而且在当前目录下还有子目录,子目录中也有文件需要编译,
那么当前目录下的Android.mk除了要包含编译当前目录下文件的语句,
同样也要包含告诉编译器在编译完当前目录下的文件后,
继续向子目录深入的语句。这里就有一个问题,
后面这个语句该如何写呢?是call all-subdir-makefiles,
还是call all-makefiles-under,$(LOCAL_PATH)呢?
这里经过我的实验,写前者是不行的,
编译器会在编译完当前目录下的文件后不再进入子目录编译。
而写成后者则可以达到我们的期望。
(2)jni/app_jni/Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE    := libcallApp_jni
LOCAL_SRC_FILES := callApp_jni.cpp
LOCAL_LDLIBS += -L$(SYSROOT)/usr/lib -llog
LOCAL_SHARED_LIBRARIES := libdl\
liblog\
libAppUpgrade\
libAppArea
include $(BUILD_SHARED_LIBRARY)

(3)jni/app_area/Android.mk
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= \
AppArea.c Encrypt.c
LOCAL_MODULE:= libAppArea

include $(BUILD_SHARED_LIBRARY)
(4)jni/app_upgrade/Android.mk

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_LDLIBS += -L$(SYSROOT)/usr/lib -llog
LOCAL_SHARED_LIBRARIES := liblog libAppArea
LOCAL_SRC_FILES:= \
AppUpgrade.c

LOCAL_MODULE:= libAppUpgrade
include $(BUILD_SHARED_LIBRARY)

2、 jni中包含多个so,不含源文件

(1)jni/Android.mk:
include $(call all-subdir-makefiles)    (包含所有子目录下Android.mk)

(2)jni/app_jni/Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE    := libcallApp_jni
LOCAL_SRC_FILES := callApp_jni.cpp
LOCAL_LDLIBS += -L$(SYSROOT)/usr/lib -llog
LOCAL_SHARED_LIBRARIES := libdl\
liblog\
libpre_AppUpgrade\
libpre_AppArea
include $(BUILD_SHARED_LIBRARY)

(3)jni/app_area/Android.mk
LOCAL_PATH := $(call my-dir)  
include $(CLEAR_VARS)  
LOCAL_MODULE := pre_AppArea 
LOCAL_SRC_FILES :=libAppArea.so                             
include $(PREBUILT_SHARED_LIBRARY)

(4)jni/app_upgrade/Android.mk

LOCAL_PATH := $(call my-dir)  
include $(CLEAR_VARS)  
LOCAL_MODULE := pre_AppUpgrade 
LOCAL_SRC_FILES :=libAppUpgrade.so                             
include $(PREBUILT_SHARED_LIBRARY)