【问题标题】:Calling a java function from C++ via JNI that returns a string [duplicate]通过返回字符串的 JNI 从 C++ 调用 java 函数 [重复]
【发布时间】:2010-12-05 15:20:24
【问题描述】:

可能重复:
How to access the Java method in a C++ application

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

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

  String getValue()
  {
    return value;
  }
}

我已经尝试了好几个小时来实现一个调用 Java 函数并返回一个字符串的 JNI 函数。 有人可以通过 sn-p 向我展示如何使用 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);

【问题讨论】:

  • 向我们展示您的尝试并告诉我们为什么它不可接受。
  • 展示C++的一面怎么样?
  • 公开你的吸气剂将是一个开始......
  • 您是否从 Java 调用您的 C 程序。 JNI 必须由 JVM 启动。 C++程序可以调用java类,但是必须先从Java调用。
  • @JamesAnderson 实际上并非如此。该程序最初可以是 C 或 C++ 程序,它可以通过调用 API 启动 JVM 本身。基本上这与 OP 的实际问题无关。

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


【解决方案1】:
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 方法ID, ...);

您的 CallObjectMethod 需要一个来自 MyClass 的对象作为第一个参数,而不是 jclass。 http://download.oracle.com/javase/1.4.2/docs/guide/jni/spec/functions.html

所以这里的任何一个调用都是错误的......

可能是 getMethodID... 你绝对应该在那里检查 NULL。

干杯,

【讨论】:

  • 什么是 native_object?
猜你喜欢
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 2017-11-30
  • 2019-11-28
  • 2022-01-24
  • 2021-05-19
  • 1970-01-01
  • 2014-06-30
相关资源
最近更新 更多