![](/img/trans.png)
[英]What is a mapping type for Object[] from java to c++ in calling function?
[英]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_1InitSDK
或package_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.