我想创建一个使用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 ++对象,这样我就能分辨出我正在阅读哪一点?
答案 0 :(得分:0)
是的,有几种方法可以做到这一点,但最简单的方法是在C ++代码中保留文件的全局变量,该代码由loadFile()
调用初始化并由getX()
引用电话。
答案 1 :(得分:0)
与Turix的解决方案类似,但没有C ++全局变量。让loadFile()
返回文件描述符并将其传递给getX()
。在检索到所有X值之后,您还应该使用closeFile()
方法关闭打开的文件。
由于你有很多值,你也可以传递getX()
本机的双精度数组,这样它就可以在一次调用中检索很多值。这是一个不同的设计,但效率会更高。
另外,请考虑使用SWIG来创建包装类。它使创建和管理Java端更多更容易。