我创建了一个使用Android Ndk运行的示例项目(HellWorldJNI)并打印了来自Jni"来自本地C的消息。
然后我从项目的Output / apk目录中提取样本的HelloWorldJNI.apk文件。
所以我从不同设备获得所有.so文件(如arm64-v8a,armeabi,x86..etc)
现在我创建了一个新项目(CallJNIFromSoFile)并在主文件夹中创建了jniLibs文件夹,并将HelloWorldJNI应用程序的所有.so文件复制到这个新项目中。
之后我加载了这个HelloWorldJNI应用程序的库和函数名称
static {
System.loadLibrary("hello-android-jni");
}
public native static String getMsgFromJni();
在这里我受到了打击,我可以加载" 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)
请建议我错过上述步骤以外的任何其他内容。我尝试了很多方法,比如重新生成.so文件,然后重新放入,但是没有用。抱歉我的英文。
提前致谢。
答案 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