【发布时间】: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