【问题标题】:JNI Java method gets jettisoned when called from c++从 C++ 调用时,JNI Java 方法被抛弃
【发布时间】:2013-07-15 16:25:21
【问题描述】:

我有一个在 C++ 上工作的项目,现在将它移植到使用 JNI 使用 java,所有计算仍然主要在 C++ 中进行,但它现在用 Java 包装,我偶然发现了一个问题,有一个我需要创建的 Java 对象,但它依赖于一些计算,因为我在 C++ 中进行这些计算,所以我决定在 C++ 中完成这些计算之后创建该对象

JNI 工作正常,因为之前有多个调用,工作正常并且断点工作(Java 方法是从本机调用的)。

Java 是从 C++ 调用的

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)
    }
}

Java

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

【问题讨论】:

  • 为您的 C++ 代码使用gdb 调试器,以确保它确实被 JVM 调用...
  • 问题是config实际上是在带有一些参数的方法内部创建的,当执行在创建MyObject的行中断时,调试器显示config是使用参数创建的,因此该方法被定义调用
  • 从 C++ 调用回 Java 非常难以调试。我建议你让 Java 向 C++ 传递一个要填充的对象。
  • 问题是对象是第三方的,一旦创建它就会开始它自己的计算,但在他需要一些参数之前(主要是在这个调用之前设置的),这就是为什么我需要在java中创建它并且不能传递对象,参数看起来也很好,我的问题实际上是为什么该方法在对象创建时被抛弃......

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


【解决方案1】:

看起来第三方软件正在调用 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);
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-04
    相关资源
    最近更新 更多