4

我正在制作一个 DLL 库的接口,所以我可以将它与 Java 一起使用。我需要我的本机函数来修改 jlong​​ 参数的值。就像参数是通过引用传递的。我的 Java 方法必须具有与此处显示的本机函数 MPUSBWrite 完全相同的参数。

实际无效代码示例: MPUSBWrite 获取其第 4 个参数作为参考并修改其值。当我读取 pLength 传递的变量时,我总是得到 0。

爪哇:

public static native boolean Write(long handle, byte[] pData, int dwLen, long pLength, int dwMilliseconds);

本机 C++:

JNIEXPORT jboolean JNICALL Java_jPicUsb_iface_Write
(JNIEnv *env, jclass jc, jlong handle, jbyteArray pData, jint dwLen, jlong pLength, jint dwMilliseconds) {
    jniByteArray b(env, pData);
    DWORD res = MPUSBWrite((HANDLE)handle,b.getBytes(),dwLen,(PDWORD)pLength,dwMilliseconds);
    if (res) {
        return JNI_TRUE;
    } else {
        return JNI_FALSE;
    }
}

有没有办法我的 C++ 代码通过引用修改 pLength 变量的值?

4

3 回答 3

2

SWIG支持此功能。

使用 SWIG,您可以更新 Java 参数值,例如 C++ 中的指针。这非常适用于对象参数。您可以放入一个 Long 对象以使其工作。

使用 Swig,您可以在 java 和 C++ 之间编写一个层,您可以将函数调用后的指针值放入 Java 对象中。Swig 还生成 Java 类,你必须要我们调用 C++ 函数。当 C++ 函数包含另一个 C++ 类作为参数时,Swig 会将此 C++ 类生成为带有 getter、setter 和您要调用的所有 C++ 函数的 Java 对象。

对于这个功能,Swig 有一种特殊的语言,你必须在 VisualStudio 项目中编写。但所有这些都在Swig 手册中进行了描述

SWIG 是一种软件开发工具,它将用 C 和 C++ 编写的程序与各种高级编程语言连接起来。SWIG 与不同类型的语言一起使用,包括常见的脚本语言,例如 Perl、PHP、Python、Tcl 和 Ruby。支持的语言列表还包括非脚本语言,例如 C#、Common Lisp(CLISP、Allegro CL、CFFI、UFFI)、Java、Lua、Modula-3、OCAML、Octave 和 R。

于 2009-04-24T08:39:40.720 回答
1

不。

如果您确实需要这样做,最好的选择是将您的第四个参数定义为 long[],并让您的 JNI 代码更新数组元素。

实际上,您最好的选择是考虑为什么不能从方法中返回 long 。

于 2009-01-28T23:20:46.127 回答
0

这不是 JNI 问题。该函数是按值调用的,没有办法修改它。传入一个对象或一个数组,这样你就可以拥有引用。

于 2009-04-24T08:30:54.763 回答