我很难找到答案。但是,在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
,也不确定它的用途。只是出于了解目的。
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>
之后可以使用的所有预定义函数。
第二个参数是对声明此本机方法的Java对象的引用。 您可以使用它从当前JNI函数调用Java对象的其他方法,即从C或C++编写的JNI代码中调用Java实例方法。
例如,如果您在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的对象的引用。
Test
是 static
的,则第二个参数 thiz
将是 jclass
类型(MainActivity
类),因此它不是指向 MainActivity
类型对象的引用。 - Khang .NThttps://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
表示 Java 类中的 this
。
有时,如果您创建一个像这样的 static native
方法。
void Java_MyClass_method1 (JNIEnv *, jclass);
jclass
表示类本身。
clazz
不是因为 Java 的某个重要部分是在德国建造的或者什么的... - i336_