在Java库中嵌入C库

问题描述

我有一个Android的Java库,已分发给第三方开发人员,我想在其中嵌入一个C库。我已通过CMake将库添加到项目中:

add_library(wrapper SHARED wrap.c)
target_link_libraries(wrapper CLibraryTarget)

我在库的build.gradle中添加了:

apply plugin: 'com.android.library'

...

android {
    defaultConfig {
        ...
        externalNativeBuild {
            cmake {
                cppFlags ""
                targets "wrapper","CLibraryTarget"
            }
        }
    }
    externalNativeBuild {
        cmake {
            path "src/main/cpp/CMakeLists.txt"
            version "3.10.0+"
        }
    }
}

在库中,我用以下命令加载C库:

public class Wrapper {
  static {
    System.loadLibrary("wrapper");
  }
  ...
}

我试图运行单元测试来测试一些包装了C函数的Java函数,但出现异常:

java.lang.UnsatisfiedLinkError: no wrapper in java.library.path

    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1871)
...

当我在App中链接C库时,此方法有效,但在Java库中似乎不起作用。为什么未加载库?我需要做什么才能将C库嵌入Java库中以进行分发?我似乎找不到针对这种情况的任何文档。

解决方法

问题是JUnit测试在主机和需要dylib库的macOS上运行,该库不是默认构建的。有approaches使gradle构建了这个库,尽管java.library.path中仍然缺少它,那时我意识到这对我来说太过分了-虽然速度不快,但可以正常工作如果使用替代测试(只需将测试从src/test移至src/androidTest)。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...