2013-07-17 4 views
0

У меня есть проект, который работает на C++ и теперь переносит его на использование java с использованием JNI, все вычисления по-прежнему выполняются в основном на C++, но теперь он завернут Java, я столкнулся с проблемой, есть объект Java, который мне нужно создать, но он зависит от некоторых вычислений, и поскольку я выполняю эти вычисления в C++, я решил просто создать этот объект после того, как эти вычисления будут выполнены в C++.Метод JNI Java отбрасывается при вызове C++

JNI работает нормально, потому что раньше было несколько вызовов, которые работают просто отлично и работают контрольные точки (методы Java вызывают из native).

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 выполняется, параметры прекрасно, но выделение или вызов конструктора никогда не происходит, это приложение не бросает никаких исключений или ошибок, выполнение продолжается, но объект никогда не создается, пожалуйста, сообщите, что может быть проблемой здесь ...

+0

Используйте 'gdb' отладчик для C++ кода, чтобы убедиться, что это действительно вызывается JVM ... –

+0

вещь конфигурации на самом деле создается внутри метода с некоторыми параметрами, а также при исполнении breaks on line, где 'MyObject' создан debuger, показывает, что config создается с параметрами, поэтому метод определенно называется – Opsenas

+0

. Вызов из C++ обратно в Java очень сложно отлаживать. Я предлагаю вам передать Java C++ объект для заполнения. –

ответ

0

Оказывается программное обеспечение третьей партии делают вызовы к элементам пользовательского интерфейса, и это было причиной отстрелить, до сих пор, я не понимаю, почему не было никаких ошибок времени выполнения ...

код решения будет быть:

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); 
     } 
    } 
} 
Смежные вопросы