Неудовлетворенная ошибка ссылки: Android JNI

Я работаю над проектом Android, который использует JNI. После 2 дней отладки я все еще получаю сообщение об ошибке: Неудовлетворительная ссылка:

Java.lang.UnsatisfiedLinkError: собственный метод не найден: 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 () (static). Это вызывает ошибку.
Пытался:
— Удаление / добавление ‘Extern «C» в sayHello () в файле cpp.
— Изменить функцию с нативной на неродную

Библиотека вроде бы нормально загружается, вот и вся ошибка:

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

1

Решение

Ваш dalvik runtime расскажет вам точно, что не так:

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

Это означает, что вы должным образом не реализовали свой собственный метод, и среда выполнения Java не может его найти. Такая ошибка возникает только во время выполнения, библиотека компилируется нормально, что дает мне догадку, что либо имя метода (в файлах .h и .cpp) неверно и не соответствует формату имен jni, либо что есть ошибка в .cpp файле.

1

Другие решения

Работает сейчас, проблема была в файле Android.mk. Спасибо Воррену за предоставленное решение;)
Рабочий файл 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)

были две ошибки; синтаксическая ошибка LOCAL_SRC_FILE (отсутствует S), и я вызвал ‘my-dir’ 2 раза в файле make, что запрещено (нашел это здесь: https://groups.google.com/forum/#!topic/android-ndk/Qmr_WQH-uKk)

1

По вопросам рекламы [email protected]