我从另一个带有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 。