使用Jni包装c ++库

时间:2014-01-06 01:34:09

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

我想创建一个使用Jni包装c ++库的包装器。基本上,我有第三方库,可以读取文件中的点(x,y,z)。所以,文件路径必须是输入参数。 我的jni就像是这样的 JNIEXPORT void JNICALL to_the_path_loadFile( JNIEnv *env, jobject obj,jstring filePath)

JNIEXPORT jdouble JNICALL to_the_path_getX( JNIEnv *env, jobject obj, jint index)

第一种方法将加载文件,第二种方法将获得坐标x。

由于文件有大量的点数,我无法将它们全部加载到内存中。 我的想法是使用迭代器迭代每个点并将其包装到Java对象。这意味着我必须多次致电getX()

我的问题是如何多次避免加载文件流?我是c ++的新手,是否有一种方法可以引用回c ++对象,这样我就能分辨出我正在阅读哪一点?

2 个答案:

答案 0 :(得分:0)

是的,有几种方法可以做到这一点,但最简单的方法是在C ++代码中保留文件的全局变量,该代码由loadFile()调用初始化并由getX()引用电话。

答案 1 :(得分:0)

与Turix的解决方案类似,但没有C ++全局变量。让loadFile()返回文件描述符并将其传递给getX()。在检索到所有X值之后,您还应该使用closeFile()方法关闭打开的文件。

由于你有很多值,你也可以传递getX()本机的双精度数组,这样它就可以在一次调用中检索很多值。这是一个不同的设计,但效率会更高。

另外,请考虑使用SWIG来创建包装类。它使创建和管理Java端更多更容易。