2014-10-06 3 views
1

JNI를 사용하는 Android 프로젝트에서 작업 중입니다. 디버깅 2 일 후, 난 여전히 오류가 발견되지는 않음 기본 방법 : 불만족스러운 링크 오류 :불만족스러운 링크 오류 : Android JNI

에서 java.lang.UnsatisfiedLinkError org.opencv.samples.facedetect.Hello.sayHello :() V

가 전에이 문제를 가지고 많은 사람들이있다, 그래서 내가 읽고 여러 가지 솔루션을 시도하지만 난 여전히 일 :(

내 코드를 얻을 수있다 :

Hello.java =

,515,
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 = (제 1 부분을 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) 

을 얼굴 검출 예제를 사용하고, i)는 Hello.sayHello() (정적 호출합니다. 이로 인해 오류가 트리거됩니다. 시도 : - 'Extern'Cpp를 제거/추가하여 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) 

, 당신이 영웅이 될 것입니다 : - 은 네이티브하지

도서관 네이티브에서 변경 기능이 잘로드 할 것, 이것은 전체 오류입니다! 난 그냥

답변

1

문제가 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가 누락되었습니다.), 그리고 'my-dir'을 make 파일에서 2 번 호출했습니다.이 파일은 금지되어 있습니다 (여기에서 찾을 수 있습니다 : https://groups.google.com/forum/#!topic/android-ndk/Qmr_WQH-uKk)

1

귀하의 달빅 런타임 정확히 어떤 문제가 당신을 알려줍니다 ... 작동 사전 :

Jelmer에서

감사를 얻을 수 없습니다

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

을 어느 즉, 네이티브 메소드를 올바르게 구현하지 않았기 때문에 자바 런타임에서 찾을 수 없다는 의미입니다. 이러한 오류는 런타임에만 발생하며 lib는 ok를 생성합니다. 즉, .h 및 .cpp 파일의 메서드 이름이 잘못되어 jni 명명 형식에 해당하지 않거나 오류가 있음을 나타냅니다. .cpp 파일에.

+0

답장을 보내 주셔서 감사합니다. 달빅이 호출 된 메소드를 찾을 수 없다는 것을 알고 있지만 이유는 모르겠습니다.헤더 파일에서 자동으로 생성 된 함수 이름을 복사했으며 밑줄을 포함하지 않았습니다 (금지되어 있음). 어떤 결과도없이 몇 시간 동안 코드를보고있었습니다. – Jelmer

+0

Hello_jni.cpp를 컴파일합니까? Android.mk에는 포함되어 있지 않습니다. –

+0

Vorren, 아, 네! 그게 사실이야. 지적 해 주셔서 고마워요. 오래 전에 Hello.cpp에서 Hello_jni.cpp로 이름을 바꾸었지만 Android.mk에서도 이름을 변경하는 것을 잊었습니다. 코드를 변경하고 코드를 다시 컴파일했지만, 슬프게도 어떤 영향도 미치지 않았습니다. 여전히 같은 오류입니다. 또한 detect_based_tracker 모듈 (작동하는 openCV 예제)과 마찬가지로 Hello_jni.cpp로 'org_opencv_samples_facedetect_Hello_jni.cpp'를 변경하려고했지만 여전히 운이 없음 – Jelmer

관련 문제