2013-01-20 9 views
9

Ho difficoltà a trovare una risposta a questo. Ma qual è il "jobject this" utilizzato nelle chiamate alle funzioni JNI? Per esempio:Che cos'è "jobject this" in JNI e a cosa serve?

jobjectArray Java_com_gnychis_awmon_Test(JNIEnv* env, jobject this) { 

Io uso env per allocare oggetti spesso, ma non ho mai usato thiz e non sono sicuro di quello che è per. Solo per scopi di conoscenza.

+5

"questo" è una parola chiave."thiz" è un nome di variabile legale che può essere usato per "oggetto" questo ". – paulsm4

risposta

11

La seguente è una funzione wrapper JNI che ha due parametri, e restituisce una matrice primitiva di oggetti:

jobjectArray Java_com_gnychis_awmon_Test(JNIEnv* env, jobject thiz); 

Dal nome della funzione che hai dato non credo che sia completo, vale a dire, non avete rispettato la convenzione nome della funzione obbligatoria che è:

  1. Avviare la funzione con Java_

  2. Aggiungere il nome del pacchetto settembre creato da _ (undescores), ovvero com_company_awesomeapp. Finora il nome della funzione è composto da: Java_com_company_awesomeapp

  3. Aggiungere il nome della classe Java in cui è stato definito il metodo nativo, seguito dal nome della funzione effettiva. Quindi a questo punto dovremmo avere il seguente nome della funzione: Java_com_company_awesomeapp_MainActivity_Test

Il primo parametro è un puntatore a una struttura di memorizzazione di tutti i puntatori a funzione JNI, vale a dire tutto the predefined functions you have available dopo aver #include <jni.h>.

Il secondo parametro è un riferimento all'oggetto Java all'interno del quale questo metodo nativo è stato dichiarato in.You can use it to call the other methods of the Java object dalla funzione JNI corrente, cioè chiamata Java metodi istanza dal codice JNI scritto in C o C++.

Se per esempio si ha la seguente classe Java all'interno del file MainActivity.java:

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(); 
} 

Poi, il jobject thiz parametro della funzione JNI sarebbe un riferimento a un oggetto di tipo MainActivity.

0

jobject thiz significa this nella classe java.

A volte se si crea un metodo static native come questo.

void Java_MyClass_method1 (JNIEnv *, jclass); 

jclass significa che la classe stessa.

+0

Quindi, sarà un riferimento/handle per l'istanza MyClass nel tuo esempio? – gnychis

+0

no, è un metodo statico .. –

+0

che cos'è il metodo? – gnychis

1

Ho trovato questo collegamento che dovrebbe aiutare a chiarire la domanda.

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

Ecco un esempio in esso che utilizza il "jobject".

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); 
    ... 
}