从c ++调用时,JNI Java方法被抛弃了

时间:2013-07-17 08:01:35

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

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

1 个答案:

答案 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);
        }
    }
}