JNI- java.lang.UnsatisfiedLinkError中:未找到本机方法 [英] JNI- java.lang.UnsatisfiedLinkError: Native method not found
问题描述
我正在开发使用了OpenCV的Android项目。有些方法不具备的Java版本,所以我必须使用NDK使用他们在我的项目。
I'm developing an Android project using OpenCV. Some of the methods do not have Java version, so I have to use NDK to use them in my project.
这是我第一次使用NDK,所以寻找一些例子后,我写了我的code,我的设备上运行,并收到错误信息如下:
This is my first time using NDK, so after searching for some examples, I wrote my code, run it on my device, and received error message below:
07-04 10:26:19.555 21270-21270/com.example.MyTest E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.UnsatisfiedLinkError: Native method not found: com.example.MyTest.JNIlib.readImg:()I
at com.example.MyTest.JNIlib.readImg(Native Method)
at com.example.MyTest.MyActivity$2.onClick(MyActivity.java:60)
at android.view.View.performClick(View.java:4211)
at android.view.View$PerformClick.run(View.java:17267)
at android.os.Handler.handleCallback(Handler.java:615)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4898)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773)
at dalvik.system.NativeStart.main(Native Method)
我再生.so文件多次,并检查命名为JNI函数。我还添加了外部的C包装器JNI的功能。但是,没有这些解决方案的工作。
I regenerated .so files for several times, and check the naming for jni functions. I also added 'extern "C"' wrappers to jni functions. But none of those solutions worked.
注:我一直用的IntelliJ IDEA来开发Java程序,并因为理念不支持NDK,我必须使用Eclipse去NDK,所以......这也是我第一次使用Eclipse。我可以做了很多愚蠢的错误。笑
Notice: I always use Intellij Idea to develop JAVA programs, and since Idea doesn't support NDK, and I have to use Eclipse to get to NDK, so...this is also the first time I use Eclipse. I could have made a lot of silly mistakes. lol
下面是我的C ++ codeS和Makefile文件。
Below are my c++ codes and makefile.
LocalMain.cpp
LocalMain.cpp
#include <stdio.h>
#include <iostream>
#include <opencv2/nonfree/nonfree.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/nonfree/features2d.hpp>
#include <opencv2/opencv.hpp>
#include <jni.h>
#include <android/log.h>
#include "LocalFeature.h"
using namespace cv;
using namespace std;
int readImg()
{
/* do something*/
return 0;
}
// JNI interface functions, be careful about the naming.
extern "C"
{
JNIEXPORT jint JNICALL Java_com_example_MyTest_JNIlib_readImg(JNIEnv * env, jobject obj);
};
JNIEXPORT jint JNICALL Java_com_example_MyTest_JNIlib_readImg(JNIEnv * env, jobject obj)
{
return (jint)readImg();
}
LocalFeatures.h和LocalFeatures.cpp没有显示,但我敢肯定,这个问题是不是与他们。
LocalFeatures.h and LocalFeatures.cpp are not shown, but I'm sure the problem is not with them.
Android.mk
Android.mk
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := nonfree_prebuilt
LOCAL_SRC_FILES := libnonfree.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := opencv_java_prebuilt
LOCAL_SRC_FILES := libopencv_java.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
# Modify LOCAL_C_INCLUDES with your path to OpenCV for Android.
LOCAL_C_INCLUDES:= E:/Java/libs/OpenCV-2.4.9-android-sdk/sdk/native/jni/include
LOCAL_MODULE := mytest_lib
LOCAL_CFLAGS := -Werror -O3 -ffast-math
LOCAL_LDLIBS += -llog -ldl
LOCAL_SHARED_LIBRARIES := nonfree_prebuilt opencv_java_prebuilt
LOCAL_SRC_FILES := LocalMain.cpp \
LocalFeature.h \
LocalFeature.cpp
include $(BUILD_SHARED_LIBRARY)
这些.cpp文件和文件的.mk是一个Eclipse项目。 libmytest_lib.so,libopencv_java.so,libnonfree.so可以正确生成。 下面.java文件是在IntelliJ IDEA的项目。我抄这些.so文件到\ LIB在理念的项目。
Those .cpp files and .mk files are in an Eclipse project. libmytest_lib.so, libopencv_java.so, libnonfree.so can be correctly generated. The following .java files are in an Intellij Idea project. I have copied these .so files to \lib in the Idea project.
JNIlib.java
JNIlib.java
public class JNIlib {
static
{
try
{
// Load necessary libraries.
System.loadLibrary("opencv_java");
System.loadLibrary("nonfree");
System.loadLibrary("mytest_lib");
}
catch( UnsatisfiedLinkError e )
{
System.err.println("Native code library error.\n");
}
}
public static native int readImg();
}
MainActivity.java部分
Part of MainActivity.java
public class MyActivity extends Activity implements CameraBridgeViewBase.CvCameraViewListener2{
public View.OnClickListener onClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
JNIlib.readImg();
}
};
/*Other irrevelant code*/
}
非常感谢!
推荐答案
以下JonesV的建议之后,我删除从我的code静态的。但在此之后,该问题依然存在。
After following JonesV's advice, I removed static from my code. But after that, the problem still exists.
最后,我调试我的我的程序,并运行到这一行的时候:
Finally I debugged my my program, and when running to this line:
System.loadLibrary("opencv_java");
该计划抛出,而不是正常运行,因为我认为一个错误。真正愚蠢的错误:其中;
The program threw an error, instead of running normally as I thought. REALLY STUPID MISTAKE :<
现在,我发现了一个错误我以前从来没有注意到。
Now that I found an error I'd never noticed before.
java.lang.UnsatisfiedLinkError: Couldn't load opencv_java: findLibrary returned null
这意味着,NO LIBS被加载。所以,我检查了我的项目结构,并发现我把我的.so文件库/文件夹,而不是库/ armeabi /文件夹。
Which means, NO LIBS ARE LOADED. So I checked my project structure, and found that I put my .so files in libs/ folder, instead of libs/armeabi/ folder.
解决的办法是在这里找到: <一href="http://stackoverflow.com/questions/9037966/android-ndk-java-lang-unsatisfiedlinkerror-findlibrary-returned-null">Android NDK java.lang.UnsatisfiedLinkError中:findLibrary返回null 通过user1647750
And the solution is found here: Android NDK java.lang.UnsatisfiedLinkError: findLibrary returned null by user1647750
这篇关于JNI- java.lang.UnsatisfiedLinkError中:未找到本机方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!