我正在尝试编译一个想要读取注册表中的端口数据的 C++ 程序。我是C++的小行家,我是Java的,这是一个与Java打交道的JNI类。已经用谷歌搜索了,我不明白他想要什么:
cl -I"%JAVA_HOME%\include" -I"%JAVA_HOME%\include\win32" myJniClass.cpp /link /DLL Microsoft (R) C/C++ 优化编译器版本 19.00.24210 for x64 版权所有 (C) Microsoft Corporation。版权所有。
Microsoft (R) Incremental Linker Version 14.00.24210.0 Copyright (C) Microsoft Corporation. All rights reserved.
/out:myJniClass.dll /dll /implib:myJniClass.lib /DLL myJniClass.obj Creating library myJniClass.lib and object myJniClass.exp myJniClass.obj : error LNK2019: unresolved external symbol
__imp_RegEnumValueA referenced in function Java_serialport_Serial_getSerialPortNames myJniClass.obj : error LNK2019: unresolved external symbol __imp_RegOpenKeyExA referenced in function Java_serialport_Serial_getSerialPortNames myJniClass.dll : fatal error LNK1120: 2 unresolved externals
编译、下载Visual C++ Build Tools并运行Visual C++ 2015 x64 Native Build Tools Command Prompt. 源本身已经过检查,没有错误。代码通过Android Studio + NDK编译成功。
这是有问题的代码片段:
HKEY phkResult;
LPCSTR lpSubKey = "HARDWARE\\DEVICEMAP\\SERIALCOMM\\";
jobjectArray returnArray = NULL;
//if(RegOpenKeyExA(HKEY_LOCAL_MACHINE, lpSubKey, 0, KEY_READ, &phkResult) == ERROR_SUCCESS){
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpSubKey, 0, KEY_READ, &phkResult) == ERROR_SUCCESS){
boolean hasMoreElements = true;
DWORD keysCount = 0;
char valueName[256];
DWORD valueNameSize;
DWORD enumResult;
while(hasMoreElements){
valueNameSize = 256;
//enumResult = RegEnumValueA(phkResult, keysCount, valueName, &valueNameSize, NULL, NULL, NULL, NULL);
enumResult = RegEnumValue(phkResult, keysCount, valueName, &valueNameSize, NULL, NULL, NULL, NULL);
if(enumResult == ERROR_SUCCESS){
keysCount++;
} else if(enumResult == ERROR_NO_MORE_ITEMS){
hasMoreElements = false;
} else {
hasMoreElements = false;
}
}
具体来说就是涉及到函数RegEnumValueA,而且大家看错了,变成了__imp_RegOpenKeyExA。此前缀出现在生成的 .lib 和 .obj 中。例如:
e __imp_PurgeComm __imp_SetCommBreak __imp_SetCommMask __imp_SetCommState __imp_SetCommTimeouts __imp_WaitCommEvent __imp_RegEnumValueA __imp_RegOpenKeyExA
尝试查看添加指令是否可以节省您的时间
这表明需要在项目中包含 Advapi32 库,实际上,您的函数位于该项目中。
您可以在 .cpp 文件之后简单地将其添加到命令行中
或相同 - 之后
/link。