微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用自定义类类型参数在 JNI 中调用 Java 函数

如何解决如何使用自定义类类型参数在 JNI 中调用 Java 函数

我正在尝试使用自定义类类型参数从 C++ 调用 Java 函数。问题是 Java 函数在从 C++ 调用获取垃圾值(代码如下所示)。如果我使用任何其他数据类型(字符串、浮点数、整数)的参数,则相同的函数 printClassVar 可以正常工作。

这是Java代码

/*Filename: CallbacksExample.java*/

public class CallbacksExample {
    static {
        System.loadLibrary("myjni");
    }
    
    public static void main(String[] args) {
        new CallbacksExample().callback();
    }

    public native void callback(); 

    public static void printClassVar(Person person)
    {
        System.out.println("Got callback from C++: " + person.age );
    }
}
/*Filename: Person.java*/

public class Person {

    public int age;

    public Person() {
        this.age = 20;
    }

    public int value() {
        return age;
    }
}

这是JNI代码

/*Filename: CallbacksExample.cpP*/

#include <iostream>
#include <jni.h>
#include "CallbacksExample.h"

using namespace std;

class Person
{
    int age;

public:
    Person()
    {
        age = 5;
    }

    int value()
    {
        return age;
    }
};

JNIEXPORT void JNICALL
Java_CallbacksExample_callback(jnienv *env,jobject jthis)
{
    jclass thisClass = env->GetobjectClass(jthis);

    Person _per;
    Person* class_ptr = &_per;

    std::cout << class_ptr->value() << std::endl;     

    jmethodID printClassVar = env->GetStaticmethodID(thisClass,"printClassVar","(LPerson;)V");
    if (NULL == printClassVar)
        return;

    env->CallVoidMethod(jthis,printClassVar,&class_ptr);
}

以上代码返回

从 C++ 得到回调:1679598160(或任何垃圾签名的 int 值

解决方法

这是在 C++ 中调用带有类类型参数的 Java 函数的正确方法

/*Filename: CallbacksExample.java*/

public class CallbacksExample {
    static {
        System.loadLibrary("myjni");
    }
    
    public static void main(String[] args) {
        new CallbacksExample().callback();
    }

    public native void callback(); 

    public static void printClassVar(Person person)
    {
        System.out.println("Got callback from C++: " + person.age );
    }
}
/*Filename: Person.java*/

public class Person {

    public int age;

    public Person() {
        this.age = 20;
    }

    public void set(int x)
    {
        age = x;
    }

    public int value() {
        return age;
    }

}
/*Filename: CallbacksExample.cpp*/

#include <iostream>
#include <jni.h>
#include "CallbacksExample.h"

JNIEXPORT void JNICALL
Java_CallbacksExample_callback(JNIEnv *env,jobject jthis)
{
    jclass thisClass = env->GetObjectClass(jthis);

    jclass personClass = env->FindClass("Person");

    jmethodID class_constructor = env->GetMethodID(personClass,"<init>","()V"); // no parameters
    jobject personObj = env->NewObject(personClass,class_constructor);

    auto personMethod = env->GetMethodID(personClass,"set","(I)V");
    env->CallVoidMethod(personObj,personMethod,15);

    jmethodID printClassVar = env->GetStaticMethodID(thisClass,"printClassVar","(LPerson;)V");
    if (NULL == printClassVar)
        return;

    env->CallVoidMethod(jthis,printClassVar,personObj);
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。