gpt4 book ai didi

android - JNI- java.lang.UnsatisfiedLinkError : Native method not found

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:00:55 27 4
gpt4 key购买 nike

我正在使用 OpenCV 开发一个 Android 项目。有些方法没有Java版本,所以我必须使用NDK才能在我的项目中使用它们。

这是我第一次使用 NDK,所以在搜索了一些示例之后,我编写了代码,在我的设备上运行它,并收到以下错误消息:

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函数的命名。我还向 jni 函数添加了 'extern "C"' 包装器。但这些解决方案都没有奏效。

注意:我一直都是用Intellij Idea来开发JAVA程序,由于Idea不支持NDK,所以要用Eclipse才能上NDK,所以……这也是我第一次用Eclipse。我本可以犯很多愚蠢的错误。哈哈

下面是我的 C++ 代码和 makefile。

本地主程序

#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 没有显示,但我确定问题不在于它们。

安卓.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 文件复制到 Idea 项目中的\lib。

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的一部分

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 的建议后,我从我的代码中删除了 static。但在那之后,问题依然存在。

最后我调试了我的程序,当运行到这一行时:

System.loadLibrary("opencv_java");

程序抛出了一个错误,而不是像我想的那样正常运行。非常愚蠢的错误:<

现在我发现了一个我以前从未注意到的错误。

java.lang.UnsatisfiedLinkError: Couldn't load opencv_java: findLibrary returned null

这意味着没有加载任何库。所以我检查了我的项目结构,发现我将 .so 文件放在了 libs/文件夹中,而不是 libs/armeabi/文件夹中。

解决方法在这里: Android NDK java.lang.UnsatisfiedLinkError: findLibrary returned null

关于android - JNI- java.lang.UnsatisfiedLinkError : Native method not found,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24566127/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com