通过JNI从C++调用返回字符串的Java函数

9
假设我有一个像这样的Java类:

可能是重复问题:
如何在C++应用程序中访问Java方法

假设我有一个像这样的Java类:

class MyClass
{
  String value = "a string value";

  String getValue()
  {
    return value;
  }
}

我已经花了几个小时尝试实现一个JNI函数,该函数调用Java函数并返回一个字符串。有人能否通过代码片段向我展示如何使用JNI从C++调用“getValue”函数,并获得来自“MyClass”的String变量值的jstring变量。
// C++
jobject result;

jMethodID method_getValue = m_env->GetMethodID(native_object,"getValue","()Ljava/lang/String;");

result = m_env->CallObjectMethod(native_object, method_getValue);

2
展示您尝试过的并告诉我们为什么不可接受。 - President James K. Polk
展示一下C++的代码怎么样? - Matt Ball
1
将您的getter设置为public是一个开始... - Alexis Dufrenoy
1
你是否从Java中调用了你的C程序。JNI必须由JVM初始化。C++程序可以调用Java类,但是它必须首先从Java中被调用。 - James Anderson
2
@JamesAnderson,实际上并非如此。该程序最初可以是C或C++程序,并且可以通过调用API自行启动JVM。基本上,这与OP的实际问题无关。 - user207421
1个回答

6
jMethodID method_getValue = m_env->GetMethodID(native_object,"getValue","()Ljava/lang/String;");

这里,native_object应该是MyClass的类定义对象(jclass)

jmethodID GetMethodID(JNIEnv *env, jclass clazz, const char *name, const char *sig);

而在这里:

result = m_env->CallObjectMethod(native_object, method_getValue);

NativeType CallMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...);

您好,需要调用CallObjectMethod方法的第一个参数应该是MyClass中的对象,而不是jclass。请参考http://download.oracle.com/javase/1.4.2/docs/guide/jni/spec/functions.html。可能是getMethodID出了问题,请务必检查是否为NULL。

祝好!


什么是native_object? - user924

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接