使用 Jni 包装 C++ 库

wrapping c++ library using Jni

本文关键字:C++ 包装 Jni 使用      更新时间:2023-10-16

我想做一个包装器,用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++ 对象,以便我能够知道我在读哪一点?

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

由于您有很多值,因此您还可以getX()双精度的本机数组传递,以便它可以在一次调用中检索许多值。这是一个不同的设计,但它会更有效。

此外,请考虑使用 SWIG 创建包装类。它使创建和管理 Java 端变得更加容易

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