gpt4 book ai didi

java - "this"不是 Android JNI 中的有效 JNI 引用

转载 作者:行者123 更新时间:2023-12-01 22:54:55 26 4
gpt4 key购买 nike

我正在使用 Android 上的 Java native 接口(interface)将当前 Activity 传递给 native 方法。但我没有使用类似 JNI 的函数名称来执行此操作。我正在手动注册 native 函数。

有效(JNI 命名)。

com_venkatesh_home.c

JNIEXPORT void JNICALL Java_com_venkatesh_Home_doStuff(JNIEnv *env, jobject activity) {
jclass Activity = (*env)->GetObjectClass (env, activity);

com.venkatesh.Home.java

private native void doStuff();
static {
System.loadLibrary("venkatesh");
}

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
doStuff();
}


但这不起作用。 (手动注册并将 Activity 作为对象传递)

me.c

static JavaVM *java_vm;

void do_stuff (jobject activity)
{
JNIEnv *env;
if ((*java_vm)->GetEnv(java_vm, (void **) &env, JNI_VERSION_1_6) != JNI_OK) {
LOG_D("GetEnv failed");
return -1;
}

jclass Activity = (*env)->GetObjectClass (env, activity);
}

jint JNI_OnLoad(JavaVM *vm, void *reserved)
{
java_vm = vm;

JNIEnv* env;
if ((*vm)->GetEnv(vm, (void **) &env, JNI_VERSION_1_6) != JNI_OK) {
LOG_D ("GetEnv failed.");
return -1;
}

// Find the class calling native function
jclass Home = (*env)->FindClass(env, "com/venkatesh/Home");
if (Home == NULL) {
LOG_D ("FindClass failed : No class found.");
return -1;
}

// Register native method for getUsbPermission
JNINativeMethod nm[1] = {
{ "doStuff", "(Landroid/app/Activity;)V", do_stuff}
};

if ((*env)->RegisterNatives(env, NativeUsb, nm , 1)) {
LOG_D ("RegisterNatives Failed.");
return -1;
}

return JNI_VERSION_1_6;
}

com.venkatesh.Home.java

private native void doStuff(Activity activity);
static {
System.loadLibrary("venkatesh");
}

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
doStuff(this);
}

错误是

JNI WARNING: 0xb89a7788 is not a valid JNI reference (GetObjectClass)

其中 0xb89a7788 是 jni 端作为 Activity 接收到的“this”。

现在,据我了解,这代表了当前的对象。相当于python中的self。但随后我将一个对象传递给 native 端,因此它应该是一个有效的引用。为什么会出现无效引用错误?这不是一个物体吗?怎么了?

最佳答案

发生这种情况不是因为方法的注册方式,而是因为 native 方法的签名。我会像这样重写该方法:

void do_stuff (JNIEnv *env, jobject this, jobject activity)
{
jclass Activity = (*env)->GetObjectClass (env, activity);
// ...and whatever else you want...
}

每个 JNI 方法都必须采用 JNIEnv * 作为其第一个参数。 (另请注意,缺少 static env 变量 - 它不是必需的)。此外,由于它不是静态方法,因此传入该方法的第一个参数将是 this 而不是 activity

关于java - "this"不是 Android JNI 中的有效 JNI 引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24239859/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com