通过JNI调用SO动态链接库的问题

lgmsyy 2014-03-21 08:38:13
这是我的JNI
JNIEXPORT jint JNICALL Java_com_callTHUserID(JNIEnv *env, jobject obj,jint model){

void *imglib;
int (*_THUserID)(int);
int result;

aslib = dlopen("./libVerifyThorCR.so", RTLD_LAZY);//打开.SO 成功
if ( aslib != NULL ) {
*(void **)(&_THUserID) = dlsym(aslib, "_THUserID");

printf("bbbbbbbbbbbbbbbbb\n");//可以打印。
//在此调用C++生成的SO(通常是第三方动态库)
result = _THUserID(model);//为什么调用SO的函数_THUserID 报错呢,而且这个日志的错误不明显啊
} else {
printf("THUserID 00000000000000\n");
}

return result;
}


以下是报错信息。

cdp@ubuntu:~/workspace/myjava/bin$ java -Djava.library.path=. com.cdp.Hello
bbbbbbbbbbbbbbbbb
#
# A fatal error has been detected by the Java Runtime Environment:
#
# SIGSEGV (0xb) at pc=0x0000000000000000, pid=4738, tid=139650285664000
#
# JRE version: 6.0_38-b04
# Java VM: Java HotSpot(TM) 64-Bit Server VM (20.13-b02 mixed mode linux-amd64 compressed oops)
# Problematic frame:
# C 0x0000000000000000 float+0x2224c000
#
# An error report file with more information is saved as:
# /home/cdp/workspace/myjava/bin/hs_err_pid4738.log
#
# If you would like to submit a bug report, please visit:
# http://java.sun.com/webapps/bugreport/crash.jsp
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
#
已放弃 (核心已转储)
cdp@ubuntu:~/workspace/myjava/bin$




void *imglib;
int (*_FreeTHFaceID)(int);
int imghandle;

imglib = dlopen("./libFaceVerifyTHOCR.so", RTLD_LAZY);
if ( imglib != NULL ) {
*(void **)(&_FreeTHFaceID) = dlsym(imglib, "_FreeTHFaceID");
printf("bbbbbbbbbbbbbbbbb\n");
imghandle = _FreeTHFaceID(frMode);
} else {
printf("FreeTHFaceID 00000000000000\n");
}


pcd@ubuntu:~/workspace/myjava/bin$ java -Djava.library.path=. com.pcd.Hello
bbbbbbbbbbbbbbbbb
#
# A fatal error has been detected by the Java Runtime Environment:
#
# SIGSEGV (0xb) at pc=0x0000000000000000, pid=4738, tid=139650285664000
#
# JRE version: 6.0_38-b04
# Java VM: Java HotSpot(TM) 64-Bit Server VM (20.13-b02 mixed mode linux-amd64 compressed oops)
# Problematic frame:
# C 0x0000000000000000 float+0x2224c000
#
# An error report file with more information is saved as:
# /home/pcd/workspace/myjava/bin/hs_err_pid4738.log
#
# If you would like to submit a bug report, please visit:
# http://java.sun.com/webapps/bugreport/crash.jsp
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
#
已放弃 (核心已转储)
pcd@ubuntu:~/workspace/myjava/bin$

...全文
280 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
lgmsyy 2014-03-23
  • 打赏
  • 举报
回复
引用 1 楼 cangyingzhijia 的回复:
*(void **)(&_THUserID) = dlsym(aslib, "_THUserID"); 这个地方会找不到符号,最好是先判断它是否为空~~ 是不是没有使用extern "C" 声明函数, 可以用nm看看so里面是不是没有这个符号存在
nm发现: _ZN7CDBScan12THUserIDE6FRMode
lgmsyy 2014-03-23
  • 打赏
  • 举报
回复
请朋友们转到 http://bbs.csdn.net/topics/390739648这个贴子,这个我不全了整个编写过程。
lgmsyy 2014-03-23
  • 打赏
  • 举报
回复
引用 3 楼 buyong 的回复:
自己看《程序员自我修养》,不用重复发帖
因为这个帖子中例子没全,所以又发送了一边帖子。
buyong 2014-03-23
  • 打赏
  • 举报
回复
自己看《程序员自我修养》,不用重复发帖
lgmsyy 2014-03-23
  • 打赏
  • 举报
回复
引用 1 楼 cangyingzhijia 的回复:
*(void **)(&_THUserID) = dlsym(aslib, "_THUserID"); 这个地方会找不到符号,最好是先判断它是否为空~~ 是不是没有使用extern "C" 声明函数, 可以用nm看看so里面是不是没有这个符号存在
以下是整个例子过程 1.有个C++的动态链接库:libLGM.so,里面有 _SayHelloID(int task)函数 -------------- 2.通过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 3.将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规范的C,程序运行的时候提示我: java: symbol lookup error: ./libTest.so: undefined symbol: _SayHelloID
苍蝇①号 2014-03-21
  • 打赏
  • 举报
回复
*(void **)(&_THUserID) = dlsym(aslib, "_THUserID"); 这个地方会找不到符号,最好是先判断它是否为空~~ 是不是没有使用extern "C" 声明函数, 可以用nm看看so里面是不是没有这个符号存在

69,381

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧