将指针从java传递给本机

时间:2009-01-28 23:15:42

标签: java parameters reference java-native-interface

我正在创建一个DLL库的接口,所以我可以将它与Java一起使用。 我需要我的原生函数来修改jlong​​参数的值。就像参数通过引用传递一样。 我的Java方法必须具有与此处显示的本机函数MPUSBWrite一样的确切参数。

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

爪哇:

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

Native 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变量的值?

3 个答案:

答案 0 :(得分:2)

SWIG支持此功能。

使用SWIG,您可以像C ++中的指针一样更新Java参数值。这适用于Object参数非常好。你可以放一个Long对象来使它工作。

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

对于此功能,Swig具有您必须在VisualStudio项目中编写的特殊语言。但所有这些都在Swig Manual

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

答案 1 :(得分:1)

没有

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

实际上,你最好的选择是考虑为什么你不能从方法中返回多长时间。

答案 2 :(得分:0)

这不是JNI问题。该函数按值调用,无法修改该函数。传入一个对象或一个数组,这样就可以获得引用。