我很难找到答案。但是,什么是" jboject thiz"用于JNI函数调用?例如:
jobjectArray Java_com_gnychis_awmon_Test( JNIEnv* env, jobject thiz ) {
我经常使用env
来分配对象,但我从来没有使用过它,我不知道它是什么用的。仅用于知识目的。
答案 0 :(得分:18)
以下是一个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>
之后的所有the predefined functions you have available。
第二个参数是对Java对象的引用,在该对象中声明了这个本机方法。 You can use it to call the other methods of the Java object来自当前的JNI函数,即从JNI代码中调用Java实例方法在C或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类型的对象的引用。
答案 1 :(得分: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);
...
}
答案 2 :(得分:0)
jobject thiz
表示java类中的this
。
有时,如果您创建这样的static native
方法。
void Java_MyClass_method1 (JNIEnv *, jclass);
jclass
表示班级本身。