在Android Studio中使用共享库时出现UnsatisfiedLinkError

时间:2015-10-12 18:22:34

标签: android c++ android-studio android-ndk android-gradle

我在Android工作室有一个NDK项目,可以添加和减去2个数字

@Override
    protected void onCreate(Bundle savedInstanceState) {

        JniAdapter jniAdapter = new JniAdapter();
        Log.d(LOG_TAG, "Sum of 1 and 1 is: " + jniAdapter.add(1, 1));
        Log.d(LOG_TAG, "Difference of 1 and 1 is: " + jniAdapter.subtract(1, 1));
    }

添加操作由外部静态库提供,外部共享库提取,使用ol'school ndk-build构建;我希望我的gradle文件编译这两个库并构建另一个共享库。但看起来静态库正在编译中,而不是共享库,我得到了共享库的UnSatifiedLinkError。没有共享库,一切正常。怎么回事?

我的gradle文件

apply plugin: 'com.android.model.application'

model {
    android {
        .....

        defaultConfig.with {
          .......
        }
    }
    android.ndk {
        moduleName = "native"
        ldLibs += ["mySharedLib"] 
        ldLibs += ["myStaticLib"]
        cppFlags += "-I${staticLibIncludeRoot}".toString() 
        cppFlags += "-I${sharedLibIncludeRoot}".toString()
    }
    android.productFlavors {
        create ("arm7") {
            ndk.abiFilters += "armeabi-v7a"
            ndk.ldFlags += "-L${staticLibRoot}/armeabi-v7a".toString() 
            ndk.ldFlags += "-L${sharedLibRoot}/armeabi-v7a".toString()
        }
    }
}
dependencies {
   .....
}

1 个答案:

答案 0 :(得分:2)

这正是共享库的本质。没有传统的程序来“编译”,链接或以其他方式将共享库转换为更大的库(一些工具有助于条带化或缩小共享库,但这是一个不同的故事)。

在Android Studio项目中使用预建的共享库是完全可以的,并通过gradle处理它们。

最简单的方法是将此类共享库的路径添加到jniLibs.srcDirs。 Android插件会将相关的二进制文件复制到生成的APK中。