无法在Android工作室使用NDK调用.so文件中的Native方法(加载库是成功的)

时间:2016-04-27 11:35:19

标签: android android-ndk

  1. 我创建了一个使用Android Ndk运行的示例项目(HellWorldJNI)并打印了来自Jni"来自本地C的消息。

  2. 然后我从项目的Output / apk目录中提取样本的HelloWorldJNI.apk文件。

  3. 所以我从不同设备获得所有.so文件(如arm64-v8a,armeabi,x86..etc)

  4. 现在我创建了一个新项目(CallJNIFromSoFile)并在主文件夹中创建了jniLibs文件夹,并将HelloWorldJNI应用程序的所有.so文件复制到这个新项目中。

  5. 之后我加载了这个HelloWorldJNI应用程序的库和函数名称

    static {
        System.loadLibrary("hello-android-jni");
    }
    
    public native  static String getMsgFromJni();
    
  6. 在这里我受到了打击,我可以加载" hello-android-jni"库没有任何问题。但是上面的本机方法getMsgFromJni()以RED颜色显示并且无法调用该方法。

    完全没有收到消息"来自Jni"

    这是我的Logcat输出:

    java.lang.UnsatisfiedLinkError: No implementation found for java.lang.String
    at com.example.hari.myopencvvsample.MainActivity.getMsgFromJni(Native Method)
    
  7. 请建议我错过上述步骤以外的任何其他内容。我尝试了很多方法,比如重新生成.so文件,然后重新放入,但是没有用。抱歉我的英文。

    提前致谢。

3 个答案:

答案 0 :(得分:0)

您需要提供方法getMsgFromJni()的JNI实现。 .so文件是共享库,您可以链接到C或C ++代码并使用它们,但是您需要为计划从Java调用的任何C或C ++方法提供接口,因此 J ava N ative I 接口。

如果查看HelloWorldJNI项目中的src / main / jni文件夹,您将看到一个C或C ++文件,该文件实现了该项目中从Java调用的任何本机方法。您还可以参考NDK samples获取更多帮助。 hello-libs example是您提问的好地方。

答案 1 :(得分:0)

在Android项目之间复制* so文件是完全糟糕的想法。 JNI将通过名称找到您的函数,该名称取决于您的Android应用程序Java类层次结构的名称。 因此,您的描述首先编译了HelloWorldJni apk,并且您的符号类似于:

T Java_com_example_helloworldjni_MainActivity_getMsgFromJni

如您所见,此函数的名称中包含您的java类层次结构。 然后,您正在创建自己的应用程序具有不同的类名,并且您的程序会查找类似的内容:

Java_com_example_hari_myopencvvsample_MainActivity_getMsgFromJni

在你的图书馆内,但正如你所知 - 它不在那里。 我建议你阅读文章https://developer.android.com/ndk/samples/sample_hellojni.html 仔细阅读有关c实现的部分,并重复新CallJNIFromSoFile项目的所有步骤。

答案 2 :(得分:0)

使用小于23的targetSdkVersion它将正常工作..

         defaultConfig {
             versionCode 1
             versionName "1.0.0"

             minSdkVersion 15
             targetSdkVersion 22