怎么用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的命名规范,自己算。
------解决方案--------------------
引用:
Quote: 引用:

参考 一下http://www.cppblog.com/wolf/articles/77828.html
已经是纯的c调用c++的问题了,你看一下,你的链接库有没有加上libLGM.so

你是windows下,还是linux下

我是在linux环境下的。

底层C++:libLGM.so,C++编写的动态链接库,包含一个_SayHelloID(int task)
中间封装层C:libTest.so:c编写的动态链接库,目的是作为中间层调用libLGM.so中的_SayHelloID
应用层:hello.c是符合JNI规范的C程序

gcc -fPIC -D_REENTRANT -I/usr/local/jdk1.8.0/include -I/usr/local/jdk1.8.0/include/linux -c Hello.c
gcc -shared Hello.o -o libHello.so

gcc -fPIC -D_REENTRANT -I/usr/local/jdk1.8.0/include -I/usr/local/jdk1.8.0/include/linux -c Test.c
gcc -shared Test.o -o libTest.so



你没有链接 libLGM.so ,你的中间层要加上 -lLGM 一下
------解决方案--------------------
你不会写一个C++程序A.cpp从文本文件in.txt读输入数据,调用这个C++.so,将结果保存到文本文件out.txt
然后在你的B.c程序将输入数据写入in.txt,用system函数调用A.exe,再从out.txt文件中读结果数据,
吗?