【问题标题】:Unable to access NDK module in emulator无法在模拟器中访问 NDK 模块
【发布时间】:2015-02-01 03:44:17
【问题描述】:

我正在使用 Android Studio 1.0.2 来生成 .so 库。当我在模拟器上加载应用程序时,加载模块时出错。错误信息是:

dlopen failed: library "HelloJNI" not found

这是我的 MainActivity.java:

public native String HelloJNI();

static
{
    System.load("HelloJNI");
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    TextView tv = new TextView(this);
    tv.setText(HelloJNI());
    setContentView(tv);
}

HelloJNI.c

JNIEXPORT jstring JNICALL Java_com_example_linda_myapplication_MainActivity_HelloJNI(JNIEnv *env, jobject obj){
(*env)->NewStringUTF(env, "Hello from JNI");
}

build.gradle

apply plugin: 'com.android.application'android {
compileSdkVersion 19
buildToolsVersion '19.1.0'

defaultConfig {
    applicationId "com.example.linda.myapplication"
    minSdkVersion 17
    targetSdkVersion 19
    versionCode 1
    versionName "1.0"

    ndk{
        moduleName "HelloJNI"
        //cFlags "-DANDROID_NDK -D_DEBUG DNULL=0"   // Define some macros
        //ldLibs "EGL", "GLESv3", "dl", "log"       // Link with these libraries!
        //stl "stlport_shared"                      // Use shared stlport library
    }
}
sourceSets.main
        {
            jniLibs.srcDir 'src/main/libs'
            jni.srcDirs = []
        }
productFlavors{
            x86{
                    ndk{
                                abiFilter "x86"
                    }
            }
            armv7a{
                        ndk{
                                    abiFilter "armeabi-v7a"
                        }
                    }
        }
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}
}
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
}

【问题讨论】:

  • 我检查了apk文件。看起来 .so 已被打包到名为“lib/armeabi-v7a”的文件夹中。但是为什么程序未能针对模块?

标签: android android-ndk java-native-interface shared-libraries


【解决方案1】:

在调用System.load()时,您必须指定库的完整路径名。

但是如果您使用System.loadLibrary() 加载本机库,框架的实现将在java.library.path 和环境变量LD_LIBRARY_PATH 指定的值中搜索您的库名称。

【讨论】:

    【解决方案2】:

    最后,我自己发现了问题。

    System.load("HelloJNI");

    这是导致apk加载失败的关键。

    System.loadLibrary("HelloJNI");

    这是正确的功能。代码完成很棒,但有时人们可能很愚蠢:)

    【讨论】:

      猜你喜欢
      • 2018-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-12
      • 2015-07-10
      • 2019-08-07
      相关资源
      最近更新 更多