NDK编译多个库

时间:2013-01-25 06:05:31

标签: android android-ndk

我在Android应用中使用本机代码。首先我只使用一个库。所以一切都很好。但现在我必须再将一个库集成到其中。我不知道应该是我的项目的jni文件夹的理想结构(如在哪里放置整个代码等)。我找到了一个解决方法。我在jni .i.e library1和library2中创建了两个文件夹。再次在两个文件夹中创建了一个jni文件夹,并将相应的代码放在文件夹中。

我得到它编译。两个.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)

2 个答案:

答案 0 :(得分:22)

我发现最好的结构是仅将jni /文件夹用于ndk-build makefile,并将源保存在自己的文件夹中。这很容易添加到现有项目而无需在jni下重构树。

但是,您必须要小心如何处理LOCAL_PATH变量并使用$(调用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。

答案 1 :(得分:0)

我发现从命令行编译时,我可以通过运行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