首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Android JNI中,"this“不是有效的JNI引用。

在Android JNI中,"this“不是有效的JNI引用。
EN

Stack Overflow用户
提问于 2014-06-16 08:53:42
回答 1查看 532关注 0票数 0

我正在使用android上的将当前的活动传递给本机方法。但我不会使用类似于JNI的函数名。我正在手动注册本机函数。

这个工作 (JNI命名)。

com_venkatesh_home.c

代码语言:javascript
复制
JNIEXPORT void JNICALL Java_com_venkatesh_Home_doStuff(JNIEnv *env, jobject activity) {
    jclass Activity = (*env)->GetObjectClass (env, activity);

com.venkatesh.Home.java

代码语言:javascript
复制
private native void doStuff();
static {
    System.loadLibrary("venkatesh");
}

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

但这不适用于,不适用于。(手动注册和将活动作为对象传递)

me.c

代码语言:javascript
复制
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

代码语言:javascript
复制
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);
 }

错误是

代码语言:javascript
复制
JNI WARNING: 0xb89a7788 is not a valid JNI reference (GetObjectClass)

其中0xb89a7788是作为活动在jni端接收的"this“。

现在,据我所知,这代表了当前的对象。相当于巨蟒中的自我。但是,我将把一个对象传递给本机端,因此它应该是一个有效的引用。为什么引用错误无效?这不是什么东西吗?怎么啦?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-16 13:18:46

之所以发生这种情况,不是因为方法是如何注册的,而是因为您的本机方法的签名。我会像这样重写这个方法:

代码语言:javascript
复制
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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24239859

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档