不满意的链接错误:Android JNI

Unsatisfied link error: Android JNI

本文关键字:Android JNI 错误 链接 不满意      更新时间:2023-10-16

我正在开发一个使用JNI的Android项目。经过2天的调试,我仍然得到一个错误:一个不满意的链接错误:

Java.lang.UnsisfiedLinkError:未找到本机方法:org.opencv.samples.facedetect.Hello.sayHello:()V

有很多人以前遇到过这个问题,所以我已经阅读并尝试了许多可能的解决方案,但我仍然无法使其发挥作用:(

我的代码:

Hello.java=

public class Hello { 
    public static native void sayHello(); 
    static {
        Log.i("JNI", "Loading hello");
        System.loadLibrary("hello");
    }
} 

Hello_jni.cpp=

#include <jni.h>
#include <Hello_jni.h>
#include <stdio.h>
#include <android/log.h>
#define LOG_TAG "FaceDetection/DetectionBasedTracker"
#define LOGD(...) ((void)__android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__))
extern "C"  JNIEXPORT void JNICALL Java_org_opencv_samples_facedetect_Hello_sayHello
 (JNIEnv *env, jclass obj)
{
 printf("Hello world!n");
 LOGD("werkt");
 return;
}

Hello_jni.h=

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class org_opencv_samples_facedetect_Hello */
#ifndef _Included_org_opencv_samples_facedetect_Hello
#define _Included_org_opencv_samples_facedetect_Hello
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     org_opencv_samples_facedetect_Hello
 * Method:    sayHello
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_org_opencv_samples_facedetect_Hello_sayHello
  (JNIEnv *, jclass);
#ifdef __cplusplus
}
#endif
#endif

Android.mk=(第一部分用于openCV的其他模块。我使用openCV的人脸检测示例作为我的应用程序的模板)

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
#OPENCV_CAMERA_MODULES:=off
#OPENCV_INSTALL_MODULES:=off
#OPENCV_LIB_TYPE:=SHARED
include ../../sdk/native/jni/OpenCV.mk
LOCAL_SRC_FILES  := DetectionBasedTracker_jni.cpp
LOCAL_C_INCLUDES += $(LOCAL_PATH)
LOCAL_LDLIBS     += -llog -ldl
LOCAL_MODULE     := detection_based_tracker
include $(BUILD_SHARED_LIBRARY)
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hello
LOCAL_SRC_FILE := org_opencv_samples_facedetect_Hello_jni.cpp
LOCAL_LDLIBS     += -llog 
include $(BUILD_SHARED_LIBRARY)

在我的主要活动中,我调用Hello.sayHello()(静态)。这会触发错误。已尝试:-删除/添加'Extern"C"'到cpp文件中的sayHello()。-将功能从原生更改为非原生

库似乎加载良好,这是整个错误:

I/JNI(21440): Hello.sayHello() called
I/JNI(21440): Loading hello
D/dalvikvm(21440): Trying to load lib /data/data/org.opencv.samples.facedetect/lib/libhello.so 0x4248c960
D/dalvikvm(21440): Added shared lib /data/data/org.opencv.samples.facedetect/lib/libhello.so 0x4248c960
D/dalvikvm(21440): No JNI_OnLoad found in /data/data/org.opencv.samples.facedetect/lib/libhello.so 0x4248c960, skipping init
W/dalvikvm(21440): No implementation found for native Lorg/opencv/samples/facedetect/Hello;.sayHello:()V
D/AndroidRuntime(21440): Shutting down VM
W/dalvikvm(21440): threadid=1: thread exiting with uncaught exception (group=0x41a4e2a0)
E/AndroidRuntime(21440): FATAL EXCEPTION: main
E/AndroidRuntime(21440): java.lang.UnsatisfiedLinkError: Native method not found: org.opencv.samples.facedetect.Hello.sayHello:()V
E/AndroidRuntime(21440):    at     org.opencv.samples.facedetect.Hello.sayHello(Native Method)

如果有人能帮我,你一定是个英雄!我就是不能让它工作。。。

提前感谢:)

Jelmer

您的dalvik运行时告诉您到底出了什么问题:

W/dalvikvm(21440): No implementation found for native Lorg/opencv/samples/facedetect/Hello;.sayHello:()V D/AndroidRuntime(21440): Shutting down VM

这意味着你没有正确实现你的原生方法,java运行时找不到它。这种错误只发生在运行时,lib编译正常,这让我有一种预感,要么是方法名称(在.h和.cpp文件中)错误,与jni命名格式不符,要么是.cpp文件出错。

现在可以工作了,问题出在Android.mk文件上。感谢Vorren提供的解决方案;)工作制作文件为:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
#OPENCV_CAMERA_MODULES:=off
#OPENCV_INSTALL_MODULES:=off
#OPENCV_LIB_TYPE:=SHARED
include ../../sdk/native/jni/OpenCV.mk
LOCAL_SRC_FILES  := DetectionBasedTracker_jni.cpp
LOCAL_C_INCLUDES += $(LOCAL_PATH)
LOCAL_LDLIBS     += -llog -ldl
LOCAL_MODULE     := detection_based_tracker
include $(BUILD_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := Hello_jni.cpp
LOCAL_C_INCLUDES := $(LOCAL_PATH)
LOCAL_LDLIBS     += -llog 
LOCAL_MODULE := hello
include $(BUILD_SHARED_LIBRARY)

有两个错误;语法错误LOCAL_SRC_FILE(缺少S),我在make文件中调用了"my dir"两次,这是被禁止的(在这里找到:https://groups.google.com/forum/#!topic/android ndk/Qmr_WQH-uKk)