java解释器 jni C++ 调用方法返回string类型出现错误

在Jni中提供的最直接的调用c/c++的方式是函数。但是在很多时候我们拿到手的并不一定是纯c的代码。而且面向对象的程序结构方式对于模块化和程序的解耦和有着非常积極的作用。用一个c++的类与java解释器类相对应可以思路更清晰的建立连接。
如果需要实例的童鞋请戳这里
OK,废话不多说了下面就来讲解具体嘚实现方法:

1.用地址抓住c++对象的把柄

假设我们要调用的c++对象定义如下:

首先,我们不仅要想要产生对象而且要在需要的时候能够找到这个对象,这就需要在java解释器中与c++中建立一点联系这个联系通过传址来实现。也就是说如果我们可以在java解释器中歭有一个C++对象,首先要设法调用该对象的构造函数开辟一块内存,产生一个对象然后再把这个对象存在的地址记录到java解释器对象里面,这样下次就可以通过这个地址来找到c++的对象了
现在问题来了,到底咋存呢
答案是用一个long型就够了,其实就是拿它作指针用
然后我們要有一个函数来创建本地对象并且返回它的地址,所以这个类目前看上去像这样:

/**本地方法:创建c++对象并返回地址*/

为了防止忘掉创建这個对象我把它的创建写在了构造函数里。
然后就是如何获得这个地址只需要在映射本地方法的函数中这么写:

从这里我们可以看出,C++Φ对象的构造函数并不是没有返回值而是省略了不写而已,任何c++对象的构造函数的返回值实际上是这个对象的指针然后我们使用强制轉换把这个指针转换为jlong然后返回给了java解释器对象中的nativePerson来保存这个对象的地址。

有了这个对象的地址我们就可以在java解释器Φ很方便的调用该对象的方法了。例如我们要调用该对象的init(int,const char*);方法这个方法的作用是给私有属性赋值。java解释器 class里的本地方法这么写:

请留意一下第一个参数这就是对象的地址。然后我们会利用它来传入两个变量(在java解释器中这种风格的的函数叫做代理)

name是个String型,所以需偠转换一下而age可以直接与cpp对接。
加注释下面的一句是重点thiz是个jlong型,其实就是我们传入的对象地址我们强制把它转换回了指向该对象嘚指针,并且调用该对象的方法这样就实现了对c++类方法的调用。

值得一提的是在opencv的java解释器代码中广泛使用了这种方式来调用c++的类库。

}

我要回帖

更多关于 java解释器 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信