首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java JNative 調用 DLL 實戰:指針、數組與字符串參數處理

     編輯:Java 相關知識

場景:C++ DLL 函數簽名

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,調用後讀取其內存

完整 Java 調用代碼

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() 必須調用,防止內存洩漏
  • JNative 限制:對 CString 支援差,改用 char* 更穩定
  • 輸出參數模式:呼叫端預分配內存,被調用端寫入,呼叫端讀取

現代替代方案

JNative 較舊,新項目建議使用:

  • JNA (Java Native Access):無需編譯原生代碼,純 Java 定義接口
  • JNI:標準但複雜,需編寫 C/C++ 橋接代碼
  • JavaCPP:針對 C++ 庫優化,支援智能指針、STL 容器

掌握底層調用原理,選擇適合專案的互操作方案。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved