簡體   English   中英

從 Java 調用 C++ 函數。 映射“常量字符*”

[英]Calling a C++ function from Java. Mapping "const char*"

我已經通過 stackoverflow 和互聯網搜索了這個,但還沒有找到答案。

我有一個指紋識別器的 SDK,但我沒有源代碼,這意味着我無法更改它。

它有幾個我需要訪問的方法,我將在下面列出哪個接口(來自 RS_API.h):

REALSCANSDK_API int __stdcall RS_InitSDK( const char* configFileName, int option, int* numOfDevice );
REALSCANSDK_API int __stdcall RS_InitDevice( int deviceIndex, int*deviceHandle );
REALSCANSDK_API int __stdcall RS_SetCaptureMode( int deviceHandle, int captureMode, int captureOption, bool withModeLED );
REALSCANSDK_API int __stdcall RS_SetViewWindow( int deviceHandle, HWND windowHandle, RECT drawRectangle, bool autoContrast );
REALSCANSDK_API int __stdcall RS_TakeImageDataEx( int deviceHandle, int timeout, int fingerIndex, bool withLED, unsigned char** imageData, int* imageWidth, int* imageHeight );

我設法將它們全部轉換為 Delphi,但我也想從 Java 應用程序訪問它。

我的原型是這樣的:

public class Leitor {
    public native int  RS_InitSDK(String configFileName, int option, int numOfDevice );

    public static void main(String[] args) {
        Leitor leitor= new Leitor();
        leitor.RS_InitSDK(null, 0, 0);
    }
  static 
  {
    System.load("C:\\temp\\SDKSuprema\\SDK\\RS_SDK.dll");    
  }
}

加載位工作正常(我相信這意味着它可以找到 dll 文件),但是當它運行本機方法時會拋出異常:

線程“main”中的異常 java.lang.UnsatisfiedLinkError: leitor.Leitor.RS_InitSDK(Ljava/lang/String;II)I at leitor.Leitor.RS_InitSK(Native Method) at leitor.Leitor.main(Leitor.java:14)

如果我重命名 dll,它會將錯誤更改為“無法加載庫”,所以我認為問題在於方法的映射。

我也找不到如何映射要從 Java 調用的按引用傳遞參數。 唯一的解決方案是更改 dll 以返回結構而不是單個結果,但這是不可能的,因為我無法更改代碼。

第二個問題是將窗口句柄從 swt 發送到 JNI 本機方法......

非常歡迎任何幫助!

您需要編寫顯式粘合代碼,將參數作為 Java 對象接受並將它們轉換為現有 C 入口點期望的表示形式。 JVM 不會自己為您做這件事。

閱讀JNI 規范以了解如何編寫此粘合代碼。

特別是,為了匹配您的 Java 聲明,JNI 入口點必須命名為package_name_here_Leitor_RS_1InitSDKpackage_name_here_Leitor_RS_1InitSDK__Ljava_lang_String_2II 請參閱規范第 2 章的“解析本地方法名稱”部分。 這個函數必須在 Java 可見的參數前面帶一些額外的參數; 請參閱規范中的“本機方法參數”

在方法中,您將字符串作為jstring值傳遞,您必須使用 JVM 中的GetStringUTFChars輔助函數將其轉換為 C 字符串。

對於傳遞引用參數,您需要找到一種方法來模擬它們對調用 Java 代碼有意義,例如傳遞一個對象,其字段由您的 JNI 代碼分配,或者(快速而骯臟地)傳遞一個int[]其第一個元素由您的 JNI 代碼分配。

您需要創建 c/c++ 粘合代碼來實現 java 方法,使用類調用 javah 將創建一個標頭,聲明與標記為本機的 java 方法的本機對應物。

如果您不想編寫 c/c++,您可以在大多數情況下使用JNA將 java 代碼映射到現有的 c 方法和結構。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM