2009-01-28 170 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