报错现象与原因
- c++调用纯c项目的动态库过程中,出现未找到所调用的函数接口定义
排查思路
- 常规思路:工程选项中,是否添加动态库定义文件xxx.lib
- 需按照调用的场景来划分:
- c++动态库,供C语言规则的函数调用下,如封装c++项目生成jni过程中,确定c++的接口头文件以及jni的头文件包括编译关键字**“extern C”**
- c++调用c项目的动态库过程中,c的接口头文件也必须加关键字**“extern C”**,否则编译器会报错,找不到接口函数的符号。
修改接口头文件
#ifndef SOURCE_TOOLS_H
#define SOURCE_TOOLS_H
#define _WIN_EXPORT_TEST
#ifdef _WIN32
#ifdef _WIN_EXPORT_TEST
#define EMBED_DLL_EXPORT __declspec(dllexport)
#else
#define EMBED_DLL_EXPORT __declspec(dllimport)
#endif
#else
#define EMBED_DLL_EXPORT
#endif
#ifdef __cplusplus
extern "C" {
#endif
EMBED_DLL_EXPORT int functionApi(const char* infile, const char* path, const char* code, const char* out);
#ifdef __cplusplus
}
#endif
#endif
Exception in thread “main” java.lang.UnsatisfiedLinkError: xxx()解决办法
-
调用java 的dll时,不能找到native method 方法的实现
-
原因:java 类对应native 方法名与xxx.h头文件中的接口中最后的包名不一致,封装时java头文件忘了加extern C关键字
#window VS工程编译.c文件报错,link链接函数错误, -
原因:如果是封装库文件,调用库函数情况下,可能是lib未包含,我遇到的这种情况是因为工程是C++工程,而代码文件既有.cpp文件,又有.c文件,导致.c文件里面定义的函数,在.cpp C++编译器里面无法识别。
-
解决方法1:直接将所有.cpp文件重命名为.c文件,解决编译问题。
-
解决方法2: 声明中用extern c来修饰。
#ifdef __cplusplus extern "C" { #endif void func(int x); #ifdef __cplusplus } #endif