【问题标题】:NDK compiling multiple librariesNDK编译多个库
【发布时间】:2013-01-25 06:05:30
【问题描述】:

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

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

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

当前结构: project_folder -> jni -> library1 -> jni -> "source code" 一个 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)

【问题讨论】:

    标签: android android-ndk


    【解决方案1】:

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

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

    • 我的项目/
      • 图书馆1/
        • source1.cpp
      • 库2/
        • 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。

    【讨论】:

    • 另外,在使用 loadLibrary 时,请省略“.so”部分,例如System.loadLibrary("library1").
    • 我尝试了你的建议。我从第一个库开始(zap 是它的名称,因此是文件夹)。但我得到一个编译错误。我不知道如何在评论中发布代码。请检查更新#1。谢谢
    • 如果 Android.mk 位于 /jni/Android.mk,则 TOP_PATH 应设置为 $(call my-dir)/..
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2016-06-20
      • 2020-04-23
      • 1970-01-01
      • 2012-12-28
      • 2013-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多