extern "C" int add(int* a, int* b, int* c, int d, char* PicPath) {
FILE *fp = fopen(PicPath, "wt");
for (int i = 0; i < d; i++) {
c[i] = a[i] + b[i];
fprintf(fp, "%d\n", c[i]);
}
fclose(fp);
return 1;
}
功能:兩數組對應元素相加存入第三數組,並寫入文件。數組長度由 d 決定。
| 問題 | 解決方案 |
|---|---|
| Java 如何傳遞指針參數 | 創建 Pointer 並分配 MemoryBlock |
| 整型參數能否直接傳遞 | 可直接傳遞 int |
| char* 路徑參數如何處理 | 用 Pointer + setStringAt(),避開 CString 兼容性問題 |
| 輸出型參數如何獲取返回值 | 傳入預分配的 Pointer,調用後讀取其內存 |
JNative t = new JNative("test.dll", "add");
t.setRetVal(Type.INT);
// 分配數組內存:10 個 int = 40 字節
Pointer a = new Pointer(MemoryBlockFactory.createMemoryBlock(4 * 10));
Pointer b = new Pointer(MemoryBlockFactory.createMemoryBlock(4 * 10));
Pointer c = new Pointer(MemoryBlockFactory.createMemoryBlock(4 * 10));
// 字符串指針
Pointer strP = createPointer(100);
strP.setStringAt(0, "C:\\1.txt");
int d = 10;
// 賦值數組
for (int i = 0; i < d; i++) {
a.setIntAt(4 * i, i);
b.setIntAt(4 * i, i);
}
// 設置參數(索引從 0 開始)
t.setParameter(0, a);
t.setParameter(1, b);
t.setParameter(2, c);
t.setParameter(3, d);
t.setParameter(4, strP);
t.invoke(); // 執行調用
// 讀取結果數組
for (int j = 0; j < d; j++) {
System.out.println(c.getAsInt(4 * j));
}
// 釋放內存
a.dispose(); b.dispose(); c.dispose();
setIntAt(4*i, ...) 按 4 字節偏移,符合 C++ int 大小dispose() 必須調用,防止內存洩漏char* 更穩定JNative 較舊,新項目建議使用:
掌握底層調用原理,選擇適合專案的互操作方案。