2013-01-20 8 views
9

Ich habe es schwer, eine Antwort darauf zu finden. Aber, was ist "jobject this" für JNI Funktionsaufrufe? Zum Beispiel:Was ist "jobject this" in JNI und wofür wird es verwendet?

jobjectArray Java_com_gnychis_awmon_Test(JNIEnv* env, jobject this) { 

Ich benutze env Objekte oft zuweisen, aber ich habe noch nie verwendet thiz und ich bin nicht sicher, was es für ist. Nur zu Wissenszwecken.

+5

"dies" ist ein Schlüsselwort."thiz" ist ein zulässiger Variablenname, der für "object" verwendet werden kann. " – paulsm4

Antwort

11

Das Folgende ist eine JNI-Wrapper-Funktion, die zwei Parameter hat, und gibt eine primitive Array von Objekten:

jobjectArray Java_com_gnychis_awmon_Test(JNIEnv* env, jobject thiz); 

Aus dem Funktionsnamen Sie gegeben haben Ich glaube nicht, es abgeschlossen ist, das heißt, Sie haben nicht die obligatorische Funktion Namenskonvention respektiert die lautet:

  1. Starten Sie die Funktion mit java_

    September
  2. Fügen Sie den Paketnamen arated by _ (undescores), d. h. com_company_awesomeapp. Bisher besteht der Funktionsname aus: Java_com_company_awesomeapp

  3. Fügen Sie den Namen der Java-Klasse, wo die native Methode definiert wurde, , gefolgt von der tatsächlichen Funktionsname. Deshalb an dieser Stelle sollten wir die folgenden Funktionsnamen haben: Java_com_company_awesomeapp_MainActivity_Test

Der erste Parameter ist ein Zeiger auf eine Struktur alle JNI Funktionszeiger zu speichern, das heißt alle the predefined functions you have available nach #include <jni.h>.

Der zweite Parameter ist eine Referenz auf das Java-Objekt in dem diese native Methode in erklärt wurde.You can use it to call the other methods of the Java object von der aktuellen JNI-Funktion, das heißt Anruf Java Instanzmethoden von JNI Code in C oder C++ geschrieben.

Wenn zum Beispiel haben Sie die folgende Java-Klasse in der MainActivity.java Datei:

public class MainActivity extends Activity 
{ 
    static 
    { 
     try 
     { 
      System.loadLibrary("mynativelib"); 
     } 
     catch (UnsatisfiedLinkError ule) 
     { 
      Log.e(TAG, "WARNING: Could not load native library: " + ule.getMessage()); 
     } 
    } 

    public static native Object[] Test(); 
} 

Dann wird der jobject thiz Parameter der JNI-Funktion wäre ein Verweis auf ein Objekt vom Typ MainActivity sein.

0

jobject thiz bedeutet die this in Java-Klasse.

Manchmal, wenn Sie eine static native Methode wie folgt erstellen.

void Java_MyClass_method1 (JNIEnv *, jclass); 

jclass bedeutet die Klasse selbst.

+0

Also wird es ein Verweis/Handle auf die MyClass-Instanz in Ihrem Beispiel? – gnychis

+0

nein, es ist eine statische Methode .. –

+0

was ist die Methode? – gnychis

1

Ich fand diesen Link, der helfen sollte, die Frage zu klären. Hier

https://library.vuforia.com/articles/Solution/How-To-Communicate-Between-Java-and-C-using-the-JNI

ist ein Beispiel darin, dass die "jobject" verwendet.

JNIEXPORT void JNICALL 
Java_com_qualcomm_QCARSamples_ImageTargets_ImageTargets_initApplicationNative(
          JNIEnv* env, jobject obj, jint width, jint height) 
{ 
    ... 
    jclass activityClass = env->GetObjectClass(obj); 
    jmethodID getTextureCountMethodID = env->GetMethodID(activityClass, 
                "getTextureCount", "()I"); 
    if (getTextureCountMethodID == 0) 
    { 
     LOG("Function getTextureCount() not found."); 
     return; 
    } 
    textureCount = env->CallIntMethod(obj, getTextureCountMethodID); 
    ... 
}