C ++ dlsym指针函数问题

时间:2016-11-08 09:59:09

标签: c++ linux java-native-interface

我从另一个带有JNI接口的共享对象(b.so)中的共享对象(a.so)调用一个函数。我使用 dlopen 加载a.so并使用 dlsym 映射函数。

以下是代码的一部分:

int (*pTestCall)(char* szMsgOut);

 //OPEN SHARED OBJECT AND CREATE A HANDLER
handle = dlopen (filename, RTLD_LAZY | RTLD_GLOBAL);

 //MAP ADRRESS OF FUNCTION INSIDE SHARED OBJECT TO FUNCTION POINTER
*(void **) (&pTestCall) = dlsym(handle, "_ZN7IpsLink9TestCallElllPc");


  int ret = pTestCall(szMsgOut);

a.so 的日志中,我可以看到 TestCall 已完成它的工作,但是当它尝试将输出写入 szMsgOut时缓冲它崩溃。如果我删除输出写入缓冲区,那就没问题了。

有人可以解释问题是什么或者崩溃的原因吗?

以下是示例:

JNIEXPORT jint JNICALL Java_Linux_WrapperLinux_Payment(JNIEnv *env, jobject obj, jcharArray jMsgOut){
int RetVal = false;
char cLog[1024] = "";
//Get the len of passed buffer
int len = env->GetArrayLength(jMsgOut);
char *szMsgOut;
szMsgOut = (char*) malloc (len);
memset(szMsgOut, 0x00, len);
//Call function
RetVal = TestCallTry(szMsgOut);
// Copy the result out of the C character buffer into a jchar buffer.  This is where we are converting chars to jchars.
jchar *jcharBuffer = (jchar *)calloc(sizeof(jchar), len);
int tempLen = strlen(szMsgOut);
for (int i = 0; i < tempLen; i ++){
    jcharBuffer[i] = (jchar)szMsgOut[i];
}
if(tempLen > 0)
// Copy the result into the jcharArray.
env->SetCharArrayRegion(jMsgOut, 0, len, jcharBuffer);
// Free the jchar buffer
free(jcharBuffer);
free(szMsgOut);
return RetVal;
}

int (*pTestCall)(char* szMsgOut);

int TestCallTry(char *szMsgOut){
void *handle;
char *error;
char filename[150]="";
char LogLocal[5000]="";
sprintf(filename,"%s/%s",path,LIB_LIBRERIA);
logga(filename,true);
logga("Loading LIB",true);
 //OPEN SHARED OBJECT AND CREATE A HANDLER
handle = dlopen (filename, RTLD_LAZY);

*(void **) (&pTestCall) = dlsym(handle, "_ZN7IpsLink9TestCallElllPc");
int ret = pTestCall(szMsgOut);
dlclose(handle);

return ret;

}

功能 Java_Linux_WrapperLinux_Payment 调用 TestCallTry

0 个答案:

没有答案