我很难找到答案。但是,JNI 函数调用中使用的“jboject thiz”是什么?例如:
jobjectArray Java_com_gnychis_awmon_Test( JNIEnv* env, jobject thiz ) {
我env
经常分配对象,但我从未使用过 thiz,我不确定它的用途。仅出于知识目的。
我很难找到答案。但是,JNI 函数调用中使用的“jboject thiz”是什么?例如:
jobjectArray Java_com_gnychis_awmon_Test( JNIEnv* env, jobject thiz ) {
我env
经常分配对象,但我从未使用过 thiz,我不确定它的用途。仅出于知识目的。
下面是一个 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>
。
第二个参数是对声明了该native方法的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
表示类本身。