通过JNI返回指向Java的类指针

Return a class pointer to Java by JNI

本文关键字:指针 Java JNI 返回 通过      更新时间:2023-10-16

c++中已有一个类指针我如何通过JNI获得这个类指针和转换到java中的类

Class_A_B.cpp

Class ClassB
{
public:
    int funcA();
    int funcB();
}
Class ClassA
{
public:
    virtual void func(){B = new ClassB();};
    ClassB* B;
    ClassB* GetClassB(){return B;};
}

Jni_Class_A_B.cpp

ClassA TestClassA = new ClassA();
extern "C"
JNIEXPORT jobject JNICALL Java_com_core_Android_getClassB(JNIEnv *env, jobject thiz)
{
    return (jobject)TestClassA->GetClassB();    // It will crash, how to converter class pointer to jobject?
}

GetClassB.java

public native ClassB getClassB();
public void TestFunction()
{
    ClassB B = getClassB();
}

没有办法将指向c++本机对象的指针(您称之为"类指针")转换为jobject。实际上,如果可以这样做,很可能会导致JVM硬崩溃……因为Java GC将无法处理c++对象。

最好是将c++指针作为32位或64位整数传递/返回给Java,然后如果Java代码需要访问c++对象的状态或调用它的方法,则使用另一个JNI调用。

c++中有一个已经存在的类指针

不,没有。有一个指针指向类b的实例

如何通过JNI获得这个类指针和转换到java中的类

你不能。它们不相等。不能将指向c++类实例的指针转换为对Java类的引用。

总之,你的问题没有意义。