Как исправить ошибку «UnsatisfiedLinkError: Реализация не найдена» с использованием jni и javah - PullRequest
0 голосов
/ 02 февраля 2019

Я хочу использовать метод C ++ внутри моего кода Java.Поэтому я решил использовать JNI.Но ссылка кажется неправильной, из-за моей ошибки при выполнении No implementation found for void com.me.Native.helloWorld() (tried Java_com_me_Native_helloWorld and Java_com_me_Native_helloWorld__)

Native.java (в другом месте называется Native.helloWorld()):

package com.me;
public class Native{
    static {
        System.loadLibrary("detection_based_tracker");
    }
    public static native void helloWorld();
}

Android.mk :

...
LOCAL_SRC_FILES  += com_me_Native.cpp
LOCAL_C_INCLUDES += $(LOCAL_PATH)
LOCAL_MODULE     := detection_based_tracker
include $(BUILD_SHARED_LIBRARY)

com_me_Native.h (создается с помощью команды javah):

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_me_Native */

#ifndef _Included_com_me_Native
#define _Included_com_me_Native
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_me_Native
 * Method:    helloWorld
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_com_me_Native_helloWorld
  (JNIEnv *, jclass);

#ifdef __cplusplus
}
#endif
#endif

com_me_Native.cpp :

#include <com_me_Native.h>
#include <iostream>
#include <android/log.h>

#define LOG_TAG "HelloWorld"
#define LOGD(...) ((void)__android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__))

#ifdef __cplusplus
extern "C" {
#endif
    using namespace std;
    /*
     * Class:     com_me_Native
     * Method:    helloWorld
     * Signature: ()V
     */
    JNIEXPORT void JNICALL Java_com_me_Native_helloWorld
      (JNIEnv *, jclass)
    {
      LOGD("Hello from c++");
    }

#ifdef __cplusplus
}
#endif

Как вы видите использование JNIEXPORT и JNICALL в моем методе.Я также использую extern "C" для использования C ++.Мой .h был сгенерирован javah.Я проверил Android.mk и не забыл добавить свой .cpp файл в LOCAL_SRC_FILES.Я статически загрузил свою библиотеку в Native.java, чтобы использовать мою статическую функцию.

Теперь я не знаю, откуда может возникнуть ошибка ... Есть идеи?!

1 Ответ

0 голосов
/ 02 февраля 2019

Защита включения должна быть только в файле .h, а не в файле .cpp.

Поэтому в вашем файле .cpp удалите следующие строки:

#ifndef _Included_com_me_Native
#define _Included_com_me_Native

Как и окончательный #endif.

Что происходит с вашим текущим кодом, так это то, что _Included_com_me_Native определяется при включении вашего заголовочного файла, поэтому #ifndef _Included_com_me_Native в файле .cpp будетfalse, и ни один из этого кода не скомпилируется.

...