2013-09-25 4 views
0

У меня есть этот класс в Java:Java JNI GetMethodID возвращение NULL

public class CameraActivity extends Activity { 

    ...  

    public class RecognitionResult { 
    public String text; 
    public int x; 
    public int y; 
    public int width; 
    public int height; 

    public RecognitionResult(String text, int x, int y, int width, int height) { 
     this.text = text; 
     this.x = x; 
     this.y = y; 
     this.width = width; 
     this.height = height; 
    } 
    } 
} 

И это мой JNI код:

extern "C" 
jobject Java_com_example_parkingcontrolsystem_CameraActivity_recognizeNumberPlate(JNIEnv *env, 
                        jobject object, 
                        jstring filename) 
{ 
    jclass cls = env->FindClass("com/example/parkingcontrolsystem/CameraActivity$RecognitionResult"); 
    std::cout << "Class: " << cls << std::endl; 

    jmethodID constructor = env->GetMethodID(cls, "<init>", "(Ljava/lang/String;IIII)V"); 
    std::cout << "Method: " << constructor << std::endl; 

    recognition_result = env->NewObject(cls, constructor, "Hello from JNI", 0, 0, 50, 100); 
    std::cout << "Object: " << recognition_result << std::endl; 

    return recognition_result; 
} 

FindClass возвращает не NULL в, OK. Но GetMethodID всегда возвращает ноль. Я попытался создать конструктор по умолчанию без args, а не использовать подпись «() V», но GetMethodID возвращает NULL.

Что не так?

+2

http://stackoverflow.com/questions/70324/java-inner-class-and-static-nested-class '" (Lcom/example/parkingcontrolsystem/CameraActivity; Ljava/lang/String; IIII) V " – Selvin

+2

Еще 2 цента: Следующая проблема заключается в том, что вы не можете вызвать этот конструктор без экземпляра CameraActivity (но я не уверен, что это возможно сделать в JNI) ... так что вам лучше сделать его статическим внутренний класс или вообще не внутренний – Selvin

+0

Спасибо, мужик! Метод найден! Хорошо, я делаю этот класс статическим внутренним классом. – herolover

ответ

1

При создании экземпляра внутреннего класса с использованием JNI родитель должен быть передан также в сигнатуре, используемой с GetMethodId, чтобы получить действительный номер jmethodID.

Предполагая B является внутренний класс A и имеет конструктор, как: public B(int someint) следующий код будет работать (jobj указывает на экземпляр A):

jclass jclazz = env->FindClass("org/somepackage/A$B"); 
assert(jclazz != nullptr); 
jmethodID mid = env->GetMethodID(jclazz, "<init>", "(Lorg/somepackage/A;I)V"); 
assert(mid != nullptr); 
env->NewObject(jclazz, mid, jobj, 1); 

Решение ППО вопрос:

jclass cls = env->FindClass("com/example/parkingcontrolsystem/CameraActivity$RecognitionResult"); 
std::cout << "Class: " << cls << std::endl; 
jmethodID constructor = env->GetMethodID(cls, "<init>","Lcom/example/parkingcontrolsystem/CameraActivity;Ljava/lang/String;IIII)V"); 
std::cout << "Method: " << constructor << std::endl; 
recognition_result = env->NewObject(cls, constructor, object, "Hello from JNI", 0, 0, 50, 100); 
std::cout << "Object: " << recognition_result << std::endl; 

Примечание: Квиты к Selven, которые также отправили тот же ответ в комментариях, но не отправили ответ.

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