无法在模拟器中访问 NDK 模块

Unable to access NDK module in emulator

我正在使用 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'])
}

最后还是自己发现了问题

System.load("HelloJNI");

这就是apk加载失败的要点

System.load图书馆("HelloJNI");

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

调用System.load().

时必须指定库的完整路径名

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