[使用JNA时Mac和Windows之间的FTDI库平台差异

问题描述 投票:0回答:1

我目前正在研究一个使用JNA访问某些FTDI库(D2XX和LibFT4222)的Java应用程序。我已经使用JNAerator创建了使用的JNA。在Windows平台上,这一切都正常工作。但是,当尝试在Mac上运行该软件时,LibFT4222出现了问题。

FT_OpenEx在D2XX中似乎可以正常工作,导致没有错误代码,我还可以检查其返回的描述以将其列为“ FT4222 A”。我还能够执行其他功能,而无需返回意外的错误代码(例如将其关闭两次,第一次导致没有错误代码,第二次导致一个错误代码)。但是,当尝试在D2XX创建的句柄上使用LibFT4222进行任何操作时,例如FT4222_I2CMaster_Init,FT4222_GetVersion或FT4222_GetClock,它会产生错误代码1000 FT4222_DEVICE_NOT_SUPPORTED。

我已经尝试过处理生成的JNA代码,例如将FT HANDLE类型从PointerByReference更改为IntByReference,并且可以使其像以前一样在Windows上正常工作,但似乎仍然无法在Mac上正常工作。

使用FTDI提供的Sample 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));
}
java jna ftdi jnaerator
1个回答
0
投票

在不同平台上的不同结果通常是类型映射的情况,但是这里没有明显的区别。我将指出我在代码中看到的一些不一致之处,希望您可以进一步解决使用此信息的问题。

FT_OpenEx()的库返回类型为FT_STATUSFT4222_I2CMaster_Init()的返回类型为FT4222_STATUS,进一步记录为FT_STATUS的扩展...实际上,它们使用相同的枚举基于整数值,但尚不清楚如何进一步定义它们。从逻辑上讲,两者期望相同的数据类型,但是在映射中,FT_STATUS映射到NativeLongFT4222_STATUS映射到int

在头文件中,基于Windows API将FT_STATUS定义为ULONG。在Windows上为4字节,在macOS上为8字节,这表明NativeLong映射可能正确。但是ULONG在macOS上不是标准类型,因此我不确定应该是什么。。。也许检测C代码以获取该类型的大小会很有用。另外,考虑到nativeDirect Mapping)声明,我怀疑原始int返回类型可能有问题。

可能相关,FT4222_STATUS代码只是C中的enum类型,因此标准不能保证宽度。如果FT4222_STATUS的返回类型在macOS上为short,这也不会令我感到惊讶。

我不确定为什么返回类型会有所作为(缺少堆栈损坏),但是开始要看是一回事。

© www.soinside.com 2019 - 2024. All rights reserved.