2009-01-28 83 views
4

我正在制作一个DLL库的接口,所以我可以在Java中使用它。 我需要我的本地函数来修改jlong​​参数的值。像参数通过引用传递一样。 我的Java方法必须具有与此处显示的本机函数MPUSBWrite相同的确切参数。将指针从java传递给本机

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

的Java:

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

回答

1

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

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

+0

我真的需要知道关于jni。我想让它返回参数而不是布尔值。 我并不想改变参数,因为我想制作一个适配器以实现完全相同的功能。 谢谢! – Gero 2009-01-28 23:29:33

0

这不是一个JNI问题。该函数是按值调用的,没有办法修改它。传递一个对象或一个数组,所以你可以有参考。

+0

感谢您的回答。但我需要完全按照它们在原始API中实现的那样来实现这些方法,以便在java中创建一个接口。 所以,我不能传递参数在一个数组或对象。 – Gero 2009-04-25 18:24:16

2

SWIG支持此功能。

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

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

对于此功能Swig有一个特殊的语言,您必须在VisualStudio项目中编写。但是这一切在Swig Manual

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

+0

另外一个不太明白传递对象引用的人与通过引用不同。感谢downvote。 – kdgregory 2009-04-24 11:18:09