简体   繁体   English

不满意的链接错误:Android JNI

[英]Unsatisfied link error: Android JNI

I'm working on a Android project which uses JNI. 我正在研究一个使用JNI的Android项目。 After 2 days of debugging, i still get an error: An unsatisfied link error: 经过2天的调试,我仍然收到错误消息:一个不满意的链接错误:

Java.lang.UnsatisfiedLinkError: Native method not found: org.opencv.samples.facedetect.Hello.sayHello:()V Java.lang.UnsatisfiedLinkError:找不到本机方法:org.opencv.samples.facedetect.Hello.sayHello :()V

There are many people who have had this problem before, so i have read and tried many possible solutions but i still can't get it to work :( 有很多人以前曾遇到过这个问题,所以我已经阅读并尝试了许多可能的解决方案,但是我仍然无法使它起作用:(

My code: 我的代码:

Hello.java = Hello.java =

public class Hello { 

    public static native void sayHello(); 

    static {
        Log.i("JNI", "Loading hello");
        System.loadLibrary("hello");
    }
} 

Hello_jni.cpp = 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 = 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 = (first part is for other module from openCV. I'm using the facedetection example from openCV as template for my application) 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)

from my main activity, i call Hello.sayHello() (static). 从我的主要活动中,我调用Hello.sayHello()(静态)。 This triggers the error. 这会触发错误。 Tried: - Removing/adding 'Extern "C"' to sayHello() in the cpp file. 尝试过:-在cpp文件中删除/添加'Extern“ C”到sayHello()。 - Change function from native to not-native -将功能从本地更改为非本地

The library seems to load fine, this is the whole error: 该库似乎加载良好,这是整个错误:

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)

If anybody can help me out, you would be a hero! 如果有人可以帮助我,您将成为英雄! I just can't get it to work... 我就是无法正常工作...

Thanks in advance :) 提前致谢 :)

Jelmer Jelmer

Your dalvik runtime tells you exactly what is wrong: 您的dalvik运行时会告诉您确切的问题所在:

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

Which means that you haven't properly implemented your native method and java runtime can't find it. 这意味着您尚未正确实现本机方法,而Java运行时无法找到它。 Such error occurs in runtime only, the lib compiles ok, which gives me a hunch, that either method name (in .h and .cpp file) is wrong and doesn't correspond to the jni naming format, or that there is an error in .cpp file. 此类错误仅在运行时发生,lib编译正常,这使我直觉,方法名称(.h和.cpp文件中)错误且与jni命名格式不对应,或者存在错误在.cpp文件中。

It's working now, the problem was the Android.mk file. 现在可以正常工作了,问题出在Android.mk文件上。 Thanks Vorren for giving the solution ;) The working make file is: 感谢Vorren提供的解决方案;)工作的make文件是:

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)

there were two errors; 有两个错误; syntax error LOCAL_SRC_FILE (missing the S), and i called 'my-dir' 2 times in the make file, which is prohibited (found this here: https://groups.google.com/forum/#!topic/android-ndk/Qmr_WQH-uKk ) 语法错误LOCAL_SRC_FILE(缺少S),我在make文件中两次调用了“ my-dir”,这是禁止的(请在此处找到: https : //groups.google.com/forum/#!topic/android- ndk / Qmr_WQH-uKk

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM