我在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)
答案 0 :(得分:22)
我发现最好的结构是仅将jni /文件夹用于ndk-build makefile,并将源保存在自己的文件夹中。这很容易添加到现有项目而无需在jni下重构树。
但是,您必须要小心如何处理LOCAL_PATH变量并使用$(调用my-dir)。这是一个有效的例子:
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