17

我在我的 android 应用程序中使用本机代码。首先,我只使用一个库。所以一切正常。但现在我必须再将一个库集成到其中。我不知道我的项目的 jni 文件夹的理想结构应该是什么(如放置整个代码的位置等)。我找到了解决办法。我在 jni .ie library1 和 library2 中创建了两个文件夹。再次在两个文件夹中创建了一个 jni 文件夹,并将各自的代码放置在文件夹中。

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

我也不知道在父 jni 文件夹的 Android.mk 文件中写什么。

当前结构:project_folder -> jni -> library1 -> jni -> "source code" an Android.mk 写在这里 project_folder -> jni -> library2 -> jni -> "source code" an 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)
4

2 回答 2

21

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

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

  • 我的项目/
    • 图书馆1/
      • 源1.cpp
    • 图书馆2/
      • 源代码2.cpp
    • 杰尼/
      • 安卓.mk
      • 应用程序.mk

安卓.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。

于 2013-01-25T06:26:03.887 回答
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
于 2014-01-08T10:42:11.243 回答