15

私はこれに対する答えを見つけるのに苦労しています。しかし、JNI関数呼び出しで使用される「jbojectthiz」とは何ですか?例えば:

jobjectArray Java_com_gnychis_awmon_Test( JNIEnv* env, jobject thiz ) {

私はよくオブジェクトを割り当てるために使用envしますが、thizを使用したことがなく、それが何のためにあるのかわかりません。知識の目的のためだけに。

4

3 に答える 3

20

以下は、2 つのパラメーターを持ち、オブジェクトのプリミティブ配列を返す JNI ラッパー関数です。

jobjectArray Java_com_gnychis_awmon_Test( JNIEnv* env, jobject thiz );

あなたが与えた関数名から、私はそれが完全ではないと思います。つまり、義務的な関数名の規則を尊重していません:

  1. Java_ で関数を開始します

  2. _ (アンデススコア) で区切られたパッケージ名を追加します。つまり、com_company_awesomeapp です。これまでのところ、関数名は Java_com_company_awesomeapp で構成されています。

  3. ネイティブ メソッドが定義されている Java クラス名を追加し、その後に実際の関数名を追加します。したがって、この時点で次の関数名が必要です: Java_com_company_awesomeapp_MainActivity_Test

最初のパラメーターは、すべての JNI 関数ポインター (つまり、後で使用できるすべての定義済み関数) を格納する構造体へのポインターです#include <jni.h>

2 番目のパラメーターは、このネイティブ メソッドが宣言されている Java オブジェクトへの参照です。これを使用して、現在の JNI 関数から Java オブジェクトの他のメソッドを呼び出すことができます。つまり、C で記述された JNI コードから Java インスタンス メソッドを呼び出します。またはC++。

たとえば、MainActivity.java ファイル内に次の 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();
}

次に、JNI 関数のjobject thizパラメータは、タイプ MainActivity のオブジェクトへの参照になります。

于 2013-01-29T09:13:16.150 に答える
1

質問を明確にするのに役立つこのリンクを見つけました。

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

「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);
    ...
}
于 2016-11-10T01:50:11.037 に答える
0

jobject thizthisin Java クラスを意味します。

場合によっては、static nativeこのようなメソッドを作成します。

void Java_MyClass_method1 (JNIEnv *, jclass);

jclassクラスそのものを意味します。

于 2013-01-21T06:33:39.120 に答える