0

我有一个在 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的调用已执行,参数很好,但分配或构造函数调用从未发生,该应用程序不会抛出任何异常或错误,执行继续,但对象永远不会创建,请建议可能是这里的问题...

4

1 回答 1

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);
        }
    }
}
于 2013-07-18T06:40:20.790 回答