Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 商店C&x2B+;JNI上下文中的类 我有两个C++类,一个用于创建工厂,另一个是这个工厂创建的对象类型。_Java_Java Native Interface - Fatal编程技术网

Java 商店C&x2B+;JNI上下文中的类 我有两个C++类,一个用于创建工厂,另一个是这个工厂创建的对象类型。

Java 商店C&x2B+;JNI上下文中的类 我有两个C++类,一个用于创建工厂,另一个是这个工厂创建的对象类型。,java,java-native-interface,Java,Java Native Interface,代码段: 因此,我希望Java端有类似的类,比如Factory和具体类A。但是,我无法理解,当我通过JNI调用CreateFactory函数时,我应该将它返回的Factory实例存储在哪里 请帮忙 您可以通过在Java类中创建一个private long字段,将本机对象与Java对象关联起来,并通过JNI将指向本机对象的指针存储在该字段中。大多数时候,当您使用JNI时,您希望类表示只存在于Java中。JNI允许您创建本机方法,这些方法可以访问它们所属的Java对象(如果它们不是静态的)。如果你真

代码段:

因此,我希望Java端有类似的类,比如
Factory
和具体类
A
。但是,我无法理解,当我通过
JNI
调用
CreateFactory
函数时,我应该将它返回的
Factory
实例存储在哪里


请帮忙

您可以通过在Java类中创建一个
private long
字段,将本机对象与Java对象关联起来,并通过JNI将指向本机对象的指针存储在该字段中。

大多数时候,当您使用JNI时,您希望类表示只存在于Java中。JNI允许您创建本机方法,这些方法可以访问它们所属的Java对象(如果它们不是静态的)。如果你真的需要C++类实例,你可能想把它存储为一个长的(坏的实践),或者,如果你知道它的大小,把它存储为DirectByteBuffer(也就是坏的实践)。@ MSTST3RPLA:作为本地代码总是。但JRE类本身就是这样做的。请注意该字段的
private
修饰符。如果您无法避免使用本机代码,那么就没有太多的替代方法。我认为使用专用长字段绝对是最简单的方法,尽管我仍然强烈建议在可能的情况下使用java类本身来存储任何数据。@Mast3rPlan:同意。我建议尽量避免使用本机代码。所以通常存储的指针是现实生活中的OS资源而不是C++对象。我完全同意,我想使用JNI是一个你想避免的东西。如果有任何东西几乎没有性能损失(除非启用了不安全的JNI)。感谢您推荐JNA
class A{

};

class Factory
{
    public:
        A *CreateObject(char *p);
};

Factory *CreateFactory(char *);