为JNI移植C包装器,从Windows到Linux

时间:2013-09-20 00:30:45

标签: java c java-native-interface

作为一名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:错误:预期'=',',',';','asm'或'属性'   在'mBioAPI_ModuleLoad'之前

当出现下列情况之一时,会在每一行中生成此类错误:

static BOOL                         mBioAPI_ModuleLoad;

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

INT                                 mRegistScore = 0;

我不知道为什么除了“int”之外还为其他变量使用“INT”。我该如何处理? :::

extern __declspec(dllimport) BioAPI_RETURN BioAPI BioAPI_ModuleUnload();

我应该使用“IMPORT”或“属性((dllexport))”吗?搜索我发现了一些推荐,但我不确定应用的是什么。 :::

CRITICAL_SECTION                    mGuiStateCS;

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

1 个答案:

答案 0 :(得分:0)

header file in question没有在Linux上定义BioAPI宏,因为它假定如果程序没有在Windows上编译,则定义宏UNIX。这意味着编译器将看到一个无效的函数指针声明,这会导致错误。

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

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

gcc -DUNIX -shared -o some.so some.c ....