将指针从java传递到本机

将指针从java传递到本机,java,parameters,reference,java-native-interface,Java,Parameters,Reference,Java Native Interface,我正在制作一个DLL库的接口,这样我就可以在Java中使用它了。 我需要我的本机函数来修改jlong参数的值。该参数是通过引用传递的。 我的Java方法必须具有如下所示的本机函数MPUSBWrite的精确参数 实际不工作代码示例: MPUSBWrite获取其第四个参数作为参考,并修改itrs值。 当我读取充分传递的变量时,我总是得到0 爪哇: 本机C++: JNIEXPORT jboolean JNICALL Java_jPicUsb_iface_Write (JNIEnv *env, jcla

我正在制作一个DLL库的接口,这样我就可以在Java中使用它了。 我需要我的本机函数来修改jlong参数的值。该参数是通过引用传递的。 我的Java方法必须具有如下所示的本机函数MPUSBWrite的精确参数

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

爪哇:

本机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;
    }
}
<> P> >我的C++代码有没有一种方法通过引用来修改长度变量的值?

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


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

< P>这不是JNI问题。函数是按值调用的,无法修改。传入一个对象或数组,这样您就可以拥有引用。

支持此功能

<> p>使用SWIG,可以更新java参数值,如C++中的指针。这对对象参数非常有效。你可以放一个长物体进去让它工作

<> p>使用SWIG,可以在java和C++之间写入一层,在其中可以将函数调用后的指针值放入java对象中。SWIG也生成java类,你必须调用C++函数。 当C++函数包含另一个C++类作为参数时,SWIG生成这个C++类,它是用GETER、SETER和所有C++函数来调用的java对象。 对于此功能,Swig有一种特殊的语言,您必须在VisualStudio项目中编写。但所有这些都在

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


我真的需要了解jni。我要让它返回参数,而不是布尔值。我不想改变参数,因为我想为DLL制作一个适配器,它实现完全相同的函数。谢谢然而另一个不太明白传递对象引用与传递引用不同的人。谢谢你的否决票。但是你可以创建一个swig dll,让它看起来像一个指针逻辑。谢谢你的回答。但是我需要实现这些方法,就像它们在原始API中实现一样,我用java制作了一个接口。因此,我无法在数组或对象中传递参数。
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;
    }
}