如何通过Java类的实例作为参数传递给JNI方法? [英] how to pass java class instance as a parameter to JNI method?

查看:293
本文介绍了如何通过Java类的实例作为参数传递给JNI方法?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想java类对象传递给JNI方法,
我想调用JNI方法几个方法如下图所示。

是否有任何人谁拥有像下面的一些例子吗?

 类JavaClassParameter {
    无效javaMethodTobeCalledInJNI(){
        ... java源...
    }
}类MainJavaClass {
    无效的someMethod(){
        JavaClassParameter对象=新JavaClassParameter();
        JNIMethod(对象);
    }    本地无效JNIMethod(JavaClassParameter对象);
}
// C ++ code
无效JNIMethod(对象){
    对象 - > javaMethodTobeCalledInJNI();
}


解决方案

您的方法声明:

 类MainJavaClass {
    本地无效JNIMethod(JavaClassParameter对象);
}

应产生一个向前声明如下所示:

  JNIEXPORT无效JNICALL Java_MainJavaClass_JNIMethod(JNIEnv的* ENV,jobject mainJavaClass);

在那的实施,你有几件事要做:

查找JavaClassParameter

使用的findClass ,它需要一个字符串名称:

  JCLASS CLS = env->的findClass(JavaClassParameter);

查找javaMethodTobeCalledInJNI()

使用的GetMethodID ,这需要该类检查,该方法的字符串名称,及其签名。由于这是一个无参数的void函数,它的签名就是()V

  jmethodID方法= env->的GetMethodID(CLS,javaMethodTobeCalledInJNI,()V);

呼叫javaMethodTobeCalledInJNI()

使用 CallVoidMethod ,这需要对象实例的方法ID,和任何参数(没有在这种情况下):

  env-> CallVoidMethod(mainJavaClass,法);


您应该检查每个步骤后空的结果;如果从一个JNI函数得到一个空回来,把它传递给另外一个,你通常会崩溃JVM

I'd like to pass java class object to JNI method, And I want to call few methods in JNI method like below.

Is there anyone who have some example like below?

class JavaClassParameter{
    void javaMethodTobeCalledInJNI(){
        ...java source...
    }
}

class MainJavaClass{
    void somemethod(){
        JavaClassParameter object = new JavaClassParameter();
        JNIMethod(object);
    }

    native void JNIMethod(JavaClassParameter object);
}


// C++ code
void JNIMethod(object){
    object->javaMethodTobeCalledInJNI();
}

解决方案

Your method declaration:

class MainJavaClass {
    native void JNIMethod(JavaClassParameter object);
}

means javah should generate a forward declaration like the following:

JNIEXPORT void JNICALL Java_MainJavaClass_JNIMethod(JNIEnv* env, jobject mainJavaClass);

In the implementation of that, you have a few things to do:

Find JavaClassParameter

Use FindClass, which takes a string name:

jclass cls = env->FindClass("JavaClassParameter");

Find javaMethodTobeCalledInJNI()

Use GetMethodID, which takes the class to check, the string name of the method, and its signature. Since this is a void function with no arguments, its signature is just ()V:

jmethodID method = env->GetMethodID(cls, "javaMethodTobeCalledInJNI", "()V");

Call javaMethodTobeCalledInJNI()

Use CallVoidMethod, which takes the object instance, the method ID, and any arguments (none in this case):

env->CallVoidMethod(mainJavaClass, method);


You should check for NULL results after each step; if you get a NULL back from one JNI function and pass it to another, you'll usually crash the JVM

这篇关于如何通过Java类的实例作为参数传递给JNI方法?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆