无法在仿真器中访问NDK模块

时间:2015-02-01 03:44:17

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

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

2 个答案:

答案 0 :(得分:0)

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

System.load( “HelloJNI”);

这是让apk失败加载的重点。

的System.loadLibrary( “HelloJNI”);

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

答案 1 :(得分:0)

使用电话System.load()时,您必须指定图书馆的完整路径名。

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