2013-01-20 5 views
9

Mam trudności ze znalezieniem odpowiedzi na to. Ale co to jest "jobject this" w wywołaniach funkcji JNI? Na przykład:Co to jest "jobject this" w JNI i do czego służy?

jobjectArray Java_com_gnychis_awmon_Test(JNIEnv* env, jobject this) { 

używam env często przeznaczyć obiektów, ale nigdy nie używałem thiz i nie jestem pewien, co to jest. Tylko dla celów wiedzy.

+5

"to" jest słowem kluczowym."thiz" jest legalną nazwą zmiennej, która może być użyta do "obiektu" to ". – paulsm4

Odpowiedz

11

Poniżej znajduje się funkcja otoki JNI który ma dwa parametry i zwraca prymitywną tablicę obiektów:

jobjectArray Java_com_gnychis_awmon_Test(JNIEnv* env, jobject thiz); 

Od nazwy funkcji dałeś I nie sądzę, że jest kompletna, to znaczy, nie przestrzegają obowiązkową nazwisko funkcja konwencję, która jest:

  1. Uruchomić funkcję z Java_

  2. Dołącz nazwa pakietu wrz arated by _ (nie powiem), czyli com_company_awesomeapp. Do tej pory nazwa funkcji składa się z: Java_com_company_awesomeapp

  3. Dołącz nazwę klasy Java, w której została zdefiniowana natywna metoda, , po której następuje faktyczna nazwa funkcji. Więc w tym momencie powinniśmy mieć następującą nazwę funkcji: Java_com_company_awesomeapp_MainActivity_Test

Pierwszym parametrem jest wskaźnik do struktury przechowywania wszystkich wskaźników funkcji JNI, czyli wszystko the predefined functions you have available po ciebie #include <jni.h>.

Drugim parametrem jest odniesienie do obiektu Java wewnątrz których natywny metoda została zadeklarowana.You can use it to call the other methods of the Java object od bieżącej funkcji JNI, to znaczy połączenia Java metody przykład wynosić od kodu JNI napisany w języku C i C++.

Jeśli na przykład masz następujące klasy Java wewnątrz pliku 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(); 
} 

Następnie jobject thiz parametr funkcji JNI byłoby odniesienie do obiektu typu główną działalność.

0

jobject thiz oznacza this w klasie java.

Czasami, jeśli utworzysz metodę taką jak ta: static native.

void Java_MyClass_method1 (JNIEnv *, jclass); 

jclass oznacza samą klasę.

+0

Tak, to będzie odwołanie/uchwyt do instancji MyClass w twoim przykładzie? – gnychis

+0

nie, to jest metoda statyczna .. –

+0

co to jest metoda? – gnychis

1

Znalazłem ten link, który powinien pomóc wyjaśnić pytanie.

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

Oto przykład na to, że używa "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); 
    ... 
}