我有一个适用于C ++的项目,现在将其移植到使用JNI的java,所有的计算仍然主要是用C ++编写的,但它现在用Java包装,我偶然发现问题,有一个我需要创建的Java对象,但它依赖于某些计算,因为我在C ++中进行那些计算,我决定在C ++中完成这些计算之后创建该对象
JNI工作正常,因为以前有多个调用,工作正常,断点有效(Java方法是从本机调用的)。
从C ++调用Java
C ++:
//after computations, C++ calls this method to call Java
extern "C"
{
void CreateObject()
{
JNIEnv *jenv = GetJavaEnv();
static jmethodID jmethod = GetJavaMethod(l_this, jenv, "CreateObject", "()V");
jenv->CallVoidMethod(l_this,jmethod)
}
}
爪哇
public class MainActivity
{
private MyObject myObject = null;
//lang and config are set from native by other calls, when i enter Create object,
//they look fine
private String lang = null;
public void CreateObject()
{
HashMap<AdConfigKey, String> config = new HashMap<AdConfigKey, String>();
config.put("my string1", "string1");
config.put("my string2", "string2");
config.put("my string3", "string3");
//at this point config looks fine, it's created and parameters are inside...
MyObject = new MyObject(this, config);
MyObject.setListener(this);
MyObject.setLanguage(lang);
}
}
事实是,对Java的调用是执行的,参数很好,但分配或构造函数调用永远不会发生,该应用程序不会抛出任何异常或错误,执行继续,但对象永远不会创建,请在这里可能会出现问题......
答案 0 :(得分:0)
看起来第三方软件正在调用UI元素,这就是抛弃它的原因,但是,我不明白为什么没有运行时错误...
解决方案代码为:
public void CreateObject()
{
runOnUiThread(new Runnable()
{
public void run()
{
HashMap<AdConfigKey, String> config = new HashMap<AdConfigKey, String>();
config.put("my string1", "string1");
config.put("my string2", "string2");
config.put("my string3", "string3");
MyObject = new MyObject(this, config);
MyObject.setListener(this);
MyObject.setLanguage(lang);
}
}
}