正在 Android 项目中链接共享库

Linking shared library in Android project

我需要在 android 工作室项目中导入用 C 文件编写的单个函数。此函数调用位于另一个文件中的其他函数(总共 50 多个 C 文件和头文件)。

这个项目已经包含一个 C++ 文件,因为我正在使用 NDK 编译 OpenCV4android。

我已经使用 Mingw 和 GCC 编译了一个共享库 (libfinal.so) 但是一旦我尝试导入它们多亏了 NDKbuild 我得到了这个毫无意义的错误:

Error:Execution failed for task ':app:ndkBuild'.
> Process 'command 'C:/SDK/ndk-bundle/ndk-build.cmd'' finished with non-zero exit value 2

这是 Android.mk 文件:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

/some opencv stuff/

include $(CLEAR_VARS)
LOCAL_MODULE := final
LOCAL_SRC_FILES := libfinal.so
LOCAL_EXPORT_C_INCLUDES := C:\SDK\NDKOpencvTest1\app\src\main\jni\include
include $(PREBUILT_SHARED_LIBRARY)

最后一行是给我错误的。

这是树层次结构:

http://imgur.com/a/G3I0y

我也尝试过这个解决方案但没有成功:

几个小时以来我一直在寻找我做错了什么..

非常感谢您的帮助!

你的层次结构是错误的。 请按照以下步骤操作:

  1. 在 jni 文件夹中创建 'lib' 文件夹,并根据目标文件夹放置共享库。这应该看起来像:'jni/lib/armeabi-v7a/libfinal.so'.

  2. 仅预构建 jni/lib 文件夹中的这些 .so 库。为此,将此行 LOCAL_SRC_FILES := libfinal.so 更改为 LOCAL_SRC_FILES := lib/$(TARGET_ARCH_ABI)/libfinal.so。这将在 jni 文件夹中搜索 lib 文件夹,然后这将根据您的 cpu 体系结构在目标文件夹中搜索 libfinal.so lib。

  3. 注意您的 gradle 脚本。您应该像这样添加 Android.mk 文件,

    externalNativeBuild {
    ndkBuild {
        path 'src/main/jni/Android.mk'
        }
    }
    

构建 Android.mk 文件后,gradle 会根据目标架构将预构建库放入 main/jni 文件夹中。为此,将此行添加到 gradle、

sourceSets.main {
        jni.srcDirs = []
        jniLibs.srcDir 'src/main/libs'
    }