Передача объекта в JNI всегда возвращает NULL

Я использую JNI для передачи объекта из C ++ в Java. Но я застрял где-то в коде, где
«GetMethodID» всегда возвращает NULL и дает сбой! Ниже приведен заголовочный файл, который я использовал, и код cpp.

Мое намерение состоит в том, чтобы вернуть объект из JNI, где я всегда получаю
«emu_response_constructor Null» в приведенном ниже коде cpp.

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

#ifndef _Included_com_em_Grabber
#define _Included_com_em_Grabber
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class:     com_em_Grabber
* Method:    getProcessedImage
* Signature: (II[B)Lcom/em/Response;
*/
JNIEXPORT jobject JNICALL Java_com_em_Grabber_getProcessedImage
(JNIEnv *, jobject, jint, jint, jbyteArray);

#ifdef __cplusplus
}
#endif
#endif

Ниже приведен файл cpp, который я использовал. Где объект передается в Java.

JNIEXPORT jobject JNICALL Java_com_em_Grabber_getProcessedImage
( JNIEnv *env, jobject obj, jint jRows, jint jCols,jbyteArray jByteArray ){

jclass emu_response = env->FindClass("com/em/Response");

if (emu_response == NULL) {
cout << "emu_response Null" << endl;
}

jmethodID emu_response_constructor = env -> GetMethodID(emu_response, "<init>", "(II[B)Lcom/em/Response;");
if (NULL == emu_response_constructor ) {

cout << "emu_response_constructor Null" << endl;

}
int number = 90;
jobject jEmuResponse = env->NewObject ( emu_response,emu_response_constructor, jByteArray, number );

return jEmuResponse;

}

Ниже мой класс Java:

public class Response {private int age;
private byte[] result = null;public Response()
{

}
public Response(byte[] result,int age) {
this.age = age;
this.result = result;
}

public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public byte[] getResult() {
return result;
}
public void setResult(byte[] result) {
this.result = result;
}

2

Решение

Не пытайтесь составлять подписи JNI самостоятельно. Используйте вывод javap -s.

В этом случае очевидно, что у вас есть типы аргументов не в порядке.
Я думаю, что правильная подпись — «([BI) Lcom / em / Response;», но не верьте мне на слово: используйте javap -s. Всегда.

И исправьте свой код так, чтобы, если вы получили неожиданный результат от любого API, вы не просто распечатали его и продолжили, как если бы значение было допустимым. Вот что стало причиной аварии.

0

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

Других решений пока нет …

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