NDK编译多个库

Dar*_*kar 16 android android-ndk

我在我的Android应用程序中使用本机代码.首先我只使用一个库.所以一切都很好.但现在我必须再将一个库集成到其中.我不知道应该是我的项目的jni文件夹的理想结构(如在哪里放置整个代码等).我找到了一个解决方法.我在jni .ie 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.
Run Code Online (Sandbox Code Playgroud)

我没有使用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)
Run Code Online (Sandbox Code Playgroud)

saf*_*ety 21

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

但是,您必须要小心如何处理LOCAL_PATH变量并使用$(调用my-dir).这是一个有效的例子:

  • 我的项目/
    • 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)
Run Code Online (Sandbox Code Playgroud)

您可以选择将Android.mk中的部分拆分为自己的makefile.

  • 此外,使用loadLibrary时,请省略".so"部分,例如System.loadLibrary("library1"). (2认同)