怎么用C语言调用C++的SO动态链接库,列出的例子很全,请大家帮忙看看小弟我的异常在哪里
如何用C语言调用C++的SO动态链接库,列出的例子很全,请大家帮忙看看我的错误在哪里
以下是整个例子过程
说明
底层C++:libLGM.so,C++编写的动态链接库,包含一个_SayHelloID(int task)
中间封装层C:libTest.so:c编写的动态链接库,目的是作为中间层调用libLGM.so中的_SayHelloID
应用层:hello.c是符合JNI规范的C程序
是不是需要在Test.c和hello.c中声明libLGM.so啊,还是直接用就可以啊。因为我将这个libLGM.so,libTest.so都放在了程序能找到的同一个位置。
--------------
1.通过C语言调用C++库函数,
Test.c
#include <stdio.h>
#ifdef __cplusplus
extern "C" {
#endif
int callSayHelloID(int task)
{
//程序提示我java: symbol lookup error: ./libTest.so: undefined symbol: _SayHelloID
return _SayHelloID(task);//libLGM.so动态库中的一个函数
}
#ifdef __cplusplus
}
#endif
2.将Test.c生成libTest.so
------------------------
3.编写符合JNI规范的C,hello.c
#include <jni.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>
#include "comHello.h"
JNIEXPORT jint JNICALL Java_com_Hello_sysHello(JNIEnv *env, jobject obj){
void *imglib;
char (*test)(int);//指向函数的指针
int imghandle;
imglib = dlopen("./libTest.so", RTLD_LAZY);//打开libTest.so库
//函数指针指向C语言的callSayHelloID函数
*(void **)(&test) = dlsym(imglib, "callSayHelloID");//最终目的是调用C++的libLGM.so中的_SayHelloID函数
test(1);//其实就是 _SayHelloID(task);//libLGM.so动态库中的一个函数
return 1;
}
执行这个符合JNI规范的hello.c,程序运行的时候提示我:
java: symbol lookup error: ./libTest.so: undefined symbol: _SayHelloID
------解决方案--------------------
C++的动态库中函数是否exten C导出的,否则不叫 _SayHelloID,用objdump查看叫什么,或者查gcc的命名规范,自己算。
------解决方案--------------------
你没有链接 libLGM.so ,你的中间层要加上 -lLGM 一下
------解决方案--------------------
你不会写一个C++程序A.cpp从文本文件in.txt读输入数据,调用这个C++.so,将结果保存到文本文件out.txt
然后在你的B.c程序将输入数据写入in.txt,用system函数调用A.exe,再从out.txt文件中读结果数据,
吗?
以下是整个例子过程
说明
底层C++:libLGM.so,C++编写的动态链接库,包含一个_SayHelloID(int task)
中间封装层C:libTest.so:c编写的动态链接库,目的是作为中间层调用libLGM.so中的_SayHelloID
应用层:hello.c是符合JNI规范的C程序
是不是需要在Test.c和hello.c中声明libLGM.so啊,还是直接用就可以啊。因为我将这个libLGM.so,libTest.so都放在了程序能找到的同一个位置。
--------------
1.通过C语言调用C++库函数,
Test.c
#include <stdio.h>
#ifdef __cplusplus
extern "C" {
#endif
int callSayHelloID(int task)
{
//程序提示我java: symbol lookup error: ./libTest.so: undefined symbol: _SayHelloID
return _SayHelloID(task);//libLGM.so动态库中的一个函数
}
#ifdef __cplusplus
}
#endif
2.将Test.c生成libTest.so
------------------------
3.编写符合JNI规范的C,hello.c
#include <jni.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>
#include "comHello.h"
JNIEXPORT jint JNICALL Java_com_Hello_sysHello(JNIEnv *env, jobject obj){
void *imglib;
char (*test)(int);//指向函数的指针
int imghandle;
imglib = dlopen("./libTest.so", RTLD_LAZY);//打开libTest.so库
//函数指针指向C语言的callSayHelloID函数
*(void **)(&test) = dlsym(imglib, "callSayHelloID");//最终目的是调用C++的libLGM.so中的_SayHelloID函数
test(1);//其实就是 _SayHelloID(task);//libLGM.so动态库中的一个函数
return 1;
}
执行这个符合JNI规范的hello.c,程序运行的时候提示我:
java: symbol lookup error: ./libTest.so: undefined symbol: _SayHelloID
------解决方案--------------------
C++的动态库中函数是否exten C导出的,否则不叫 _SayHelloID,用objdump查看叫什么,或者查gcc的命名规范,自己算。
------解决方案--------------------
你没有链接 libLGM.so ,你的中间层要加上 -lLGM 一下
------解决方案--------------------
你不会写一个C++程序A.cpp从文本文件in.txt读输入数据,调用这个C++.so,将结果保存到文本文件out.txt
然后在你的B.c程序将输入数据写入in.txt,用system函数调用A.exe,再从out.txt文件中读结果数据,
吗?