【问题标题】:wrapping c++ library using Jni使用 Jni 包装 c++ 库
【发布时间】:2014-01-06 11:39:42
【问题描述】:

我想制作一个使用 Jni 包装 c++ 库的包装器。基本上,我有 3rd 方库,可以从文件中读取点(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++ 对象,这样我就可以知道我正在阅读哪一点?

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多