2013-06-04 3 views
2

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

Мое намерение состоит в том, чтобы вернуть объект из 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; 
    } 
+0

Вы можете добавить свой класс 'Java'? –

+0

@ ZagorulkinDmitry Я обновил сообщение с Java-классом. – 2vision2

+0

Просьба также показать метод 'native',' Grabber.getProcessedImage() '. Это может быть проблема декларации. –

ответ

0

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

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

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

+0

@downvoter Пожалуйста, объясните, почему вы не должны использовать javap -s, чтобы получить отличные от букв JNI сигнатуры методов и/или почему вы не должны проверять результат вызовов JNI API. – EJP

Смежные вопросы