作为一名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类型。我可以用什么等同替代?
答案 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 ....