0

作为一名 JAVA 开发人员(C 知识有限),我必须在 Linux 上为成像设备开发 SDK。

这是场景。设备 SDK 具有在 Windows (.dll) 和 Linux (.so) 上实现的共享库。两种实现中函数的名称和签名是相同的,即使两者只有一本参考手册。

它们提供了一些使用 JNI 调用本机方法的 Java 代码。由于 SDK 库中的函数不能被 JNI 直接调用,所以 SDK 也提供了一个 C 代码,以 JNI 调用它们的方式公开函数(它基本上是使用生成的头文件的实现) “javah”工具)。

现在我的问题是,这个暴露类似 JNI 功能的 C 代码是由供应商提供的,在 Windows 上测试和编译,所以我必须在 Linux 和过程中编译,做出必要的改变。

此时,我已经执行了以下 gcc 命令:

gcc -shared -o some.so some.c -I/usr/local/jdk1.7.0_40/include -I/usr/local/jdk1.7.0_40/include/linux -I/someSDKpath/Linux/Inc

编译器抛出此错误:

/someSDKpath/Linux/Inc/bioapi_type.h:195: 错误: '*' 标记之前的预期')'

这一行指的是:

typedef BioAPI_RETURN (BioAPI *BioAPI_ModuleEventHandler)
    (const BioAPI_UUID *BSPUuid,
    void* AppNotifyCallbackCtx,
    BioAPI_DEVICE_ID DeviceID,
    uint32 Reserved,
    BioAPI_MODULE_EVENT EventType);

每次声明这种类型时都会发生错误。

我希望有人可以帮助我解决这个错误,或者给我一些成功完成这项工作的指导方针。

:::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::::::::::

感谢Joni,我可以解决前一个问题。

现在我还有一个(重复)错误:

PvsApiJv.c:32:错误:在“mBioAPI_ModuleLoad”之前需要“=”、“,”、“;”、“asm”或“<strong>attribute”</p>

当出现以下情况之一时,每行都会生成这种错误:

static BOOL                         mBioAPI_ModuleLoad;

我可以将其更改为“int”并找到用 0 代替 False 和 1 代替 True 的用法吗?:::

INT                                 mRegistScore = 0;

我不知道他们为什么除了“int”之外还使用“INT”来表示其他变量。我该如何进行呢?:::

extern __declspec(dllimport) BioAPI_RETURN BioAPI BioAPI_ModuleUnload();

我应该使用“IMPORT”还是“ attribute ((dllexport))”?搜索我发现了一些建议,但我不确定要申请什么。:::

CRITICAL_SECTION                    mGuiStateCS;

我知道的最后一个是特定的 Windows 类型。我可以用什么等价物代替?

4

1 回答 1

0

有问题的头文件没有BioAPI在 Linux 上定义宏,因为它假定UNIX如果程序没有在 Windows 上编译,则定义了宏。这意味着编译器将看到无效的函数指针声明,从而导致错误。

 20 #elif defined (UNIX)
 21 
 22 #define BioAPI
 23 #define CALLBACK
 24 
 25 #endif

您可以在编译时在编译器的命令行上定义宏:

gcc -DUNIX -shared -o some.so some.c ....
于 2013-09-20T16:52:53.820 回答