将JNI对象作为引用指针访问Java层
我正在编写一个应用程序,其中我与将JNI对象作为引用指针访问Java层,java,android,c++,pointers,java-native-interface,Java,Android,C++,Pointers,Java Native Interface,我正在编写一个应用程序,其中我与JNI调用有很多关系,每次我都必须执行getter()调用来访问变量值。相反,可以访问Java层上JNI对象的对象引用,这样就可以只通过变量名获得更新的变量值(比如obj.name而不是obj.getName()) 我已经和和进行了检查,但并没有找到在java层将地址转换为对象的方法 编辑 我想从JNI以这种方式在Java层访问Obj private native CustomObj getCPPCustomObjectPointer(); 这里有任何建议。您想
JNI
调用有很多关系,每次我都必须执行getter()
调用来访问变量值。相反,可以访问Java层上JNI
对象的对象引用,这样就可以只通过变量名获得更新的变量值(比如obj.name
而不是obj.getName()
)
我已经和和进行了检查,但并没有找到在java层将地址转换为对象的方法
编辑
我想从JNI以这种方式在Java层访问Obj
private native CustomObj getCPPCustomObjectPointer();
这里有任何建议。您想保留Java方面对C++对象的引用吗你不能 用于表示和访问对象/原语的那些实现(C/Java)是完全不同的。 这就是为什么当您从一种数据类型转换到另一种数据类型时会有这么多 可以在Java层访问JNI对象的对象引用吗 是的,你可以。但是,您不能使用它访问其属性。您只能将其地址作为
long
值保存
如果您想这样做,您应该在堆内存中创建C++对象,并将它们的地址返回为<代码>长编号。p>
MyClass *obj = new MyClass();
return (long) obj;
在Java端,您可以将该地址保存为一个long
数字,无论您想保存在哪里。因为对象是在堆内存中创建的,所以它们在JNI调用之间仍然有效
也必须将它们传递给后来的JNI调用,作为<代码>长号,然后在C++侧将它们转换为<代码> MyCype */Cuff>。
MyClass *obj = (MyClass *)thatLongNumber;
obj->someProperty; // Access its properties and methods via -> operator
您应该能够使用
native
方法为JNI访问创建一个Java类。你为什么不发布你现在拥有的代码,这样社区就可以看一看,找出前进的最佳途径?我接着从JavaJNI设置对象,但如何从JNIJava作为指针对象进行访问,以便可以通过名称访问类对象变量。这就是我卡住的地方。请发布您的代码。克里斯,我不知道如何将对象从JNI获取到Java,这就是我卡住的地方。我已经更新了我对JNI层的期望。请遵循。这可能很有用:用于访问对象字段的Oracle Java文档在这里:谢谢..将保留地址尽可能长,我知道,但如果无法访问属性,则没有任何用处。我们可以用一些伪代码通过JNI->Java->JNI(访问属性)访问属性吗?我不明白你说的“JNI->Java->JNI(访问属性)”是什么意思。如果C++ C++(java)中的C++对象(其地址为<代码> > >代码> >编号,则不能在java端执行此操作,但可以在C++端进行。我是说,从JNI到java获取地址,现在从Java到JNI读取相同的地址,以读取指针引用的对象属性。我被困在如何通过JNI层的这个“长”地址创建对象上。@Shubh只需将其强制转换即可<代码>MyClass*obj=(MyClass*)长编号代码>