私はこれに対する答えを見つけるのに苦労しています。しかし、JNI関数呼び出しで使用される「jbojectthiz」とは何ですか?例えば:
jobjectArray Java_com_gnychis_awmon_Test( JNIEnv* env, jobject thiz ) {
私はよくオブジェクトを割り当てるために使用env
しますが、thizを使用したことがなく、それが何のためにあるのかわかりません。知識の目的のためだけに。
私はこれに対する答えを見つけるのに苦労しています。しかし、JNI関数呼び出しで使用される「jbojectthiz」とは何ですか?例えば:
jobjectArray Java_com_gnychis_awmon_Test( JNIEnv* env, jobject thiz ) {
私はよくオブジェクトを割り当てるために使用env
しますが、thizを使用したことがなく、それが何のためにあるのかわかりません。知識の目的のためだけに。
以下は、2 つのパラメーターを持ち、オブジェクトのプリミティブ配列を返す JNI ラッパー関数です。
jobjectArray Java_com_gnychis_awmon_Test( JNIEnv* env, jobject thiz );
あなたが与えた関数名から、私はそれが完全ではないと思います。つまり、義務的な関数名の規則を尊重していません:
Java_ で関数を開始します
_ (アンデススコア) で区切られたパッケージ名を追加します。つまり、com_company_awesomeapp です。これまでのところ、関数名は Java_com_company_awesomeapp で構成されています。
ネイティブ メソッドが定義されている 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 のオブジェクトへの参照になります。
質問を明確にするのに役立つこのリンクを見つけました。
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);
...
}
jobject thiz
this
in Java クラスを意味します。
場合によっては、static native
このようなメソッドを作成します。
void Java_MyClass_method1 (JNIEnv *, jclass);
jclass
クラスそのものを意味します。