我正在创建一个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变量的值?
答案 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问题。该函数按值调用,无法修改该函数。传入一个对象或一个数组,这样就可以获得引用。