问题描述
我有一个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
)。