通过JNI返回Java的类指针

时间:2014-03-11 09:36:50

标签: java android c++ java-native-interface

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();
}

2 个答案:

答案 0 :(得分:2)

无法将指针转换为C ++本机对象(将其放入“类指针”)到jobject。实际上,如果你可以这样做,你很可能会使JVM硬崩溃......“因为Java GC无法应对C ++对象。

您可以做的最好的事情是将C ++指针作为32位或64位整数传递给Java,然后如果Java代码需要访问C ++对象的状态或调用其上的方法,则使用另一个JNI调用

答案 1 :(得分:0)

  

C ++中有一个现有的类指针

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

  

如何通过JNI

将此类指针和转换器转换为java类

你做不到。他们并不等同。指向C ++类实例的指针无法转换为对Java类的引用。

简而言之,你的问题没有意义。