2012-02-13 16 views
10

Jest to prawdopodobnie głupie pytanie, które ujawnia brak zrozumienia JNI. Piszę program C++, który hermetyzuje maszynę Java VM: Wywołuję funkcje w VM za pomocą wywołań takich jak CallVoidMethod. To tylko tło i nie bardzo pasuje do pytania.Nazwa klasy z jclass w JNI

Chciałbym móc znaleźć nazwę klasy Java, biorąc pod uwagę instancję klasy jclass. Czy jest jakiś sposób to zrobić? Czy mogę po prostu wywołać funkcję GetName, tak jak w programie Java?

Odpowiedz

12

Instancja jclass jest obiektem, na który zostanie wywołana metoda; musisz wyszukać identyfikator metody getName na klasie Class, a następnie wywołać go w instancji jclass, używając CallObjectMethod, aby uzyskać wynik jstring.

Krótko mówiąc, po prostu zadzwoń do funkcji GetName i spójrz na wynik jstring.

EDIT

(obsługa błędów pomijana)

JNIENV* env = ...; 
// substitute your desired class's specifier for "java/lang/Class"... 
jclass cls = (*env)->FindClass("java/lang/Class"); 
MethodID mid_getName = (*env)->GetMethodID(env, cls, "getName", "()Ljava/lang/String;"); 
jstring name = (*env)->CallObjectMethod(env, cls, mid_getName); 
+0

Przepraszam, ale mój mózg po prostu zaczęli jeść, kiedy się odczytać odpowiedź ze względu na zagnieżdżonego-meta charakter tej kwestii. Czy mógłbyś pokazać prosty przykład kodu? – namuol

+0

Wygląda obiecująco, ale env-> ExceptionOccurred() jest prawdziwe po wywołaniu GetMethodID dla mnie. – JonnyBoy

+0

Myślę, że może to być bliższe poszukiwanej odpowiedzi: http://stackoverflow.com/questions/12719766/can-i-know-the -name-of-the-class-to-calls-a-jni-c-method – Wheezil

Powiązane problemy