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
- LIBRARY1/
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文件。
我发现,在命令行编译时,我可以通过运行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
此外,使用调用LoadLibrary时,离开了“所以”部分,例如系统。的LoadLibrary( “LIBRARY1”)。 – safety
我试过你的建议。我从第一个库开始(zap是它的名字,因此是文件夹)。但我收到编译错误。我不知道如何在评论中发布代码。请检查更新#1。谢谢 –
如果Android.mk在 /jni/Android.mk,那么TOP_PATH应该设置为$(call my-dir)/ .. –
safety