簡體   English   中英

使用 JNA 時 Mac 和 Windows 之間的 FTDI 庫平台差異

[英]FTDI library platform differences between Mac and Windows when using JNA

我目前正在開發一個 Java 應用程序,該應用程序使用 JNA 訪問一些 FTDI 庫,包括 D2XX 和 LibFT4222。 我已經使用 JNAerator 創建了使用的 JNA。 這在 Windows 平台上都可以正常工作。 然而,當我嘗試在 Mac 上運行該軟件時,我遇到了 LibFT4222 的問題。

FT_OpenEx 在 D2XX 中似乎工作正常,導致沒有錯誤代碼,我也可以檢查其返回的描述,看到它被列為“FT4222 A”。 我還能夠在不返回意外錯誤代碼的情況下執行其他功能(例如關閉它兩次,第一次沒有錯誤代碼,第二次產生預期的錯誤代碼)。 但是,當在 D2XX 創建的 Handle(例如 FT4222_I2CMaster_Init、FT4222_GetVersion 或 FT4222_GetClock)上嘗試使用 LibFT4222 進行任何操作時,它會產生錯誤代碼 1000 FT4222_DEVICE_NOT_SUPPORTED。

我嘗試過使用生成的 JNA 代碼,例如將 FT HANDLE 類型從 PointerByReference 更改為 IntByReference,並且可以像以前一樣在 Windows 上正常工作,但似乎仍然無法在 Mac 上工作。

使用 FTDI 提供的示例 C 文件的修改版本(使用相同的 LibFT4222.dylib),相同的邏輯可以正常工作,所以我知道它可以在 Mac 上正常工作。 如前所述,上述所有內容在 Windows 上都沒有問題。

任何人都可以提供有關 Mac OSX 和 Windows 之間可能導致這種行為的差異的任何見解嗎?

編輯以包含代碼,示例 Java 代碼(在這種情況下,描述將是“FT4222 A”,而 OpenEx 似乎可以正常工作)這適用於 Windows,但在 Mac 上 FT4222_I2CMaster_Init 返回 1000:

Memory memory = new Memory(16);
memory.setString(0, "FT4222 A");
PointerByReference handle = new PointerByReference();
Ftd2xxLibrary.FT_OpenEx(new PVOID(memory), 
Ftd2xxLibrary.FT_OPEN_BY_DESCRIPTION, handle);
FT4222Library.FT_HANDLE ftHandle = new FT4222Library.FT_HANDLE(handle.getValue());
logger.warn("init" + FT4222Library.FT4222_I2CMaster_Init(ftHandle, (int) 100));

FT_OpenEx 在哪里(由 JNAerator 自動生成):/**

 * Original signature : <code>FT_STATUS FT_OpenEx(PVOID, DWORD, FT_HANDLE*)</code><br>
 * <i>native declaration : line 336</i>
 */
public static native NativeLong FT_OpenEx(Ftd2xxLibrary.PVOID pArg1, int Flags, PointerByReference pHandle);

其中 FT4222_I2CMaster_Initis(由 JNAerator 自動生成):

    /**
 * FT4222 I2C Functions<br>
     * Original signature : <code>FT4222_STATUS FT4222_I2CMaster_Init(FT_HANDLE, uint32)</code><br>
     * <i>native declaration : line 338</i>
     */
    public static native int FT4222_I2CMaster_Init(FT4222Library.FT_HANDLE ftHandle, int kbps);

FT_HANDLE 在哪里(由 JNAerator 自動生成):

public static class FT_HANDLE extends PointerType {
        public FT_HANDLE(Pointer address) {
            super(address);
        }
        public FT_HANDLE() {
            super();
        }
    };

C 代碼在 Mac 上正常工作(返回 0):

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "ftd2xx.h"
#include "libft4222.h"

static void init()
{
    FT_HANDLE            ftHandle = (FT_HANDLE)NULL;
    FT_OpenEx("FT4222 A", FT_OPEN_BY_DESCRIPTION, &ftHandle);
    printf("Init %d",FT4222_I2CMaster_Init(ftHandle,100));
}

不同平台上的不同結果往往是類型映射的一種情況,但這里沒有明顯的區別。 我將指出我在代碼中看到的一些不一致之處,希望您可以使用這些信息進一步排除故障。

圖書館返回類型FT_OpenEx()FT_STATUS ,並返回類型FT4222_I2CMaster_Init()FT4222_STATUS ,這進一步證明作為的延伸FT_STATUS ......而事實上它們使用相同的枚舉整數值的基礎,但目前還不清楚如何它們被進一步定義。 從邏輯上講,人們期望兩者具有相同的數據類型,但是在您的映射中, FT_STATUS映射到NativeLong並且FT4222_STATUS映射到int

在頭文件中, FT_STATUS基於 Windows API 被 typedef 為ULONG 這在 Windows 上是 4 個字節,但在 macOS 上可能是 8 個字節,這表明NativeLong映射可能是正確的。 但是ULONG不是 macOS 上的標准類型,所以我不確定它應該是什么......也許檢測 C 代碼以獲得該類型的大小會很有用。 此外,鑒於本native直接映射)聲明,我懷疑原始int返回類型可能有問題。

可能相關, FT4222_STATUS代碼只是 C 中的enum類型,因此標准不保證寬度。 如果FT4222_STATUS的返回類型在 macOS 上很short ,我不會感到驚訝。

我不確定為什么返回類型會有所作為(沒有堆棧損壞),但開始查看是一回事。

暫無
暫無

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

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