我有一个使用opencv android sdk的项目,为了加快速度,决定用C ++实现一些函数。
无论如何我正在使用gradle实验插件0.4.0以及何时为arm64-v8a构建,链接器告诉我它无法在jniLibs文件夹中找到库..尝试了许多不同的变体,我相信路径是正确的(使用cd)检查终端
这是我的app.gradle:
apply plugin: 'com.android.model.application' model{
android {
compileSdkVersion = 23
buildToolsVersion = "23.0.2"
/* sourceSets.main {
jniLibs.srcDir 'src/main/jniLibs' //set libs as .so's location instead of jni
jni.srcDirs = [] //disable automatic ndk-build call with auto-generated Android.mk file
}*/
defaultConfig.with {
applicationId = "com.sketchcamera.camera"
minSdkVersion.apiLevel = 15
targetSdkVersion.apiLevel = 23
versionCode = 105
versionName = "1.05"
}
}
android.buildTypes {
release {
minifyEnabled = false
proguardFiles.add(file('proguard-android.txt'))
//proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
//jniDebuggable = true
// signingConfig signingConfigs.release
}
debug {
//jniDebuggable = true
}
}
android.productFlavors {
create("AArch-64") {
ndk.with{
abiFilters.add("arm64-v8a")
File curDir = file('./')
curDir = file(curDir.absolutePath)
String libsDir = curDir.absolutePath + "/src/main/jniLibs/arm64-v8a/"
ldLibs.add(libsDir + "libopencv_core.a")
ldLibs.add(libsDir + "libopencv_highgui.a")
ldLibs.add(libsDir + "libopencv_imgproc.a")
ldLibs.add(libsDir + "libopencv_java3.so")
ldLibs.add(libsDir + "libopencv_ml.a")
}
}
create("arm") {
ndk.with{
abiFilters.add("armeabi")
File curDir = file('./')
curDir = file(curDir.absolutePath)
String libsDir = curDir.absolutePath + "/src/main/jniLibs/armeabi/"
ldLibs.add(libsDir + "libopencv_core.a")
ldLibs.add(libsDir + "libopencv_highgui.a")
ldLibs.add(libsDir + "libopencv_imgproc.a")
ldLibs.add(libsDir + "libopencv_java3.so")
ldLibs.add(libsDir + "libopencv_ml.a")
}
}
create("armv7") {
ndk.with {
abiFilters.add("armeabi-v7a")
File curDir = file('./')
curDir = file(curDir.absolutePath)
String libsDir = curDir.absolutePath + "/src/main/jniLibs/armeabi-v7a/"
ldLibs.add(libsDir + "libopencv_core.a")
ldLibs.add(libsDir + "libopencv_highgui.a")
ldLibs.add(libsDir + "libopencv_imgproc.a")
ldLibs.add(libsDir + "libopencv_java3.so")
ldLibs.add(libsDir + "libopencv_ml.a")
ldLibs.add(libsDir + "libopencv_ts.a")
}
}
}
android.ndk {
moduleName = "opencv_fast_processing"
cppFlags.add("-std=c++11")
cppFlags.add("-fexceptions")
cppFlags.add("-I${file("/home/onur/Masaüstü/Home/OpenCV-android-sdk/sdk/native/jni/include")}".toString())
ldLibs.addAll(["android", "EGL", "GLESv2", "dl", "log", "z"])
stl = "gnustl_shared"
}
// android.useLibrary = 'org.apache.http.legacy'
}
如果我使用arm7或arm,一切都很好但是如果使用arm64-v8a进行编译,则链接器会出现此错误:
/home/onur/Android/android-ndk-r11c/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/../lib/gcc/aarch64-linux-android/4.9/../../../../aarch64-linux-android/bin/ld: cannot find -l/home/onur/AndroidStudioProjects/SketchCamera/app/src/main/jniLibs/arm64-v8a/libopencv_core.a
和其他文件的错误相同.. 正如我所说的那样,我确信路径是正确的,但不知道/ home前面的-l是什么(对C和gnu没有多少经验)
我是这个JNI的新手,很可能做了一些愚蠢的事情。谢谢你的帮助
答案 0 :(得分:3)
我遇到了同样的问题,但是libcrypto
(OpenSSL)。
我设法通过更改我的build.gradle
文件来解决它。而是使用productFlavors
我更改为repositores
部分,如下例所示:
删除这段代码:
abis {
create("x86") {
ldLibs.add("${file("src/main/jniLibs/x86/libcrypto.so")}".toString())
}
create("x86_64") {
ldLibs.add("${file("src/main/jniLibs/x86_64/libcrypto.so")}".toString())
}
create("armeabi-v7a") {
ldLibs.add("${file("src/main/jniLibs/armeabi-v7a/libcrypto.so")}".toString())
}
create("arm64-v8a") {
ldLibs.add("${file("src/main/jniLibs/armeabi-v7a/libcrypto.so")}".toString())
}
}
并添加以下内容:
repositories {
prebuilt(PrebuiltLibraries) {
prebuiltSharedlib {
binaries.withType(SharedLibraryBinary) {
sharedLibraryFile = file("src/main/jniLibs/${targetPlatform.getName()}/libcrypto.so")
}
}
}
}
android.sources {
main {
jni {
dependencies {
library "prebuiltSharedlib"
}
}
}
}
最后在ndk
部分内设置ABI过滤器:
abiFilters.addAll(["armeabi-v7a", "arm64-v8a", "x86", "x86_64"])
希望它有所帮助。