NDK编译多个库

问题描述:

我在我的android应用程序中使用本机代码。首先,我只使用一个库。所以一切正常。但现在我不得不再整合一个库。我不知道什么应该是我的项目的jni文件夹的理想结构(如在哪里放置整个代码等)。我找到了一个工作。我在jni.i.e library1和library2中创建了两个文件夹。再次在这两个文件夹中创建一个jni文件夹并将相应的代码放入文件夹中。NDK编译多个库

我得到它来编译。两个.so文件都正在生成,但我无法在我的应用程序中使用它。我不能使用System.loadLibrary(“library1.so”)加载库;也尝试提供完整路径。但失败

此外,我不知道在父jni文件夹的Android.mk文件内写什么。

当前结构: project_folder - > JNI - > LIBRARY1 - > JNI - > “源代码” 的Android.mk这里所写 project_folder - > JNI - > library2 - > JNI - > “源代码” 一个Android .mk这里

更新#1写到:

Gdbserver  : [arm-linux-androideabi-4.6] libs/armeabi/gdbserver 
Gdbsetup  : libs/armeabi/gdb.setup 
make: *** No rule to make target `jni/zap/jni/zap/zap/error.c', needed by `obj/local/armeabi/objs-debug/zap/jni/zap/zap/error.o'. Stop. 

我不使用Application.mk。 这是我的Android.mk:

TOP_PATH := $(call my-dir) 

# Build library 1 
include $(CLEAR_VARS) 
LOCAL_PATH := $(TOP_PATH)/zap 
LOCAL_MODULE := zap 
LOCAL_C_INCLUDES := $(LOCAL_PATH)/zap 
LOCAL_SRC_FILES := $(LOCAL_PATH)/zap/error.c \ 
$(LOCAL_PATH)/zap/hello-jni.c \ 
$(LOCAL_PATH)/zap/zap.c \ 
$(LOCAL_PATH)/zap/zapd.c \ 
$(LOCAL_PATH)/zap/zaplib.c 
include $(BUILD_SHARED_LIBRARY) 

我发现最好的结构是使用JNI /文件夹仅NDK-建立makefile和外界保持源在自己的文件夹。这很容易添加到现有的项目,而不需要在jni下重构你的树。

但是,您必须小心处理LOCAL_PATH变量和使用$(call my-dir)。这里有一个工作示例:

  • MyProject的/
    • LIBRARY1/
      • source1.cpp
    • library2/
      • source2.cpp
    • JNI/
      • Android.mk
      • Application.mk

Android.mk:

# TOP_PATH refers to the project root dir (MyProject) 
TOP_PATH := $(call my-dir)/.. 

# Build library 1 
include $(CLEAR_VARS) 
LOCAL_PATH := $(TOP_PATH)/library1 
LOCAL_MODULE := library1 
LOCAL_C_INCLUDES := $(LOCAL_PATH) 
LOCAL_SRC_FILES := source1.cpp 
include $(BUILD_SHARED_LIBRARY) 

# Build library 2 
include $(CLEAR_VARS) 
LOCAL_PATH := $(TOP_PATH)/library2 
LOCAL_MODULE := library2 
LOCAL_C_INCLUDES := $(LOCAL_PATH) 
LOCAL_SRC_FILES := source2.cpp 
include $(BUILD_SHARED_LIBRARY) 

可以在Android.mk任选分裂出来的部分,以自己makefile文件。

+2

此外,使用调用LoadLibrary时,离开了“所以”部分,例如系统。的LoadLibrary( “LIBRARY1”)。 – safety

+0

我试过你的建议。我从第一个库开始(zap是它的名字,因此是文件夹)。但我收到编译错误。我不知道如何在评论中发布代码。请检查更新#1。谢谢 –

+0

如果Android.mk在 /jni/Android.mk,那么TOP_PATH应该设置为$(call my-dir)/ .. – safety

我发现,在命令行编译时,我可以通过运行android update project两次包括多个库,一旦与每个库:

android update project -l ../SDK/library1/ --path . --name $name --target 23 --subprojects 
android update project -l ../SDK/library2/ --path . --name $name --target 23 --subprojects 
ant release