在C++ JNI函数(下面包含的半伪)中,在client_ = new VClient(&callback_)
行至少会创建一个(可能还有两个)附加线程。我认为这个函数的完成就足够了,但显然当下一个函数(另一个JNICALL函数)在这之后被“立即”调用时,它会导致SEGFUALT(“立即”在引号中,因为函数调用的速度如同有人可以推下一个按钮)。我认为这是因为创建new VClient
在Init函数返回并调用下一个函数时尚未完成,因为在下一个函数中使用了client_
。C++/Java之间的线程函数完成信号
我对所有这些线程业务都比较陌生,我不确定这是否是一个正确的思路。我习惯于按顺序执行代码,因此当代码从client_
行开始时,这是因为该行的所有内容都已完成。是否可以让代码从这一行继续前进,并在新的VClient
完全创建之前从JNI Init函数返回?如果是这样,我将如何让这个函数等到类/对象完成创建?
JNIEXPORT void JNICALL Java_com_ClassDir_Init(JNIEnv *env, jobject obj)
{
LOGI("%s", __PRETTY_FUNCTION__);
if(!client_)
{
LOGI("Initializing client");
client_ = new VClient(&callback_);
[Bunch of JNI/JAVA class and methodID lookup and saving]
}
else
LOGI("Client already initialized");
}
*的callback_
是处理发送枚举类型信号以JNI/JAVA到节目进度更新类。
可以显示堆栈跟踪(可能位于'hs_err *'文件中)吗?你如何保存Java类?你将它们转换为全局引用吗? VClient的构造函数是否保存任何Java引用?在哪个线程中调用了'callback'?你在VClient的构造函数中使用了哪些线程(你是否使用JNI调用)? – ninjalj