CallObjectMethod不返回字符串
CallObjectMethod does not return a string
我的目标是在C++
中创建一个Java
类的实例,然后调用Java
类中定义的方法。
这是我的Java
类的总结:
EXICodec.java
public class EXICodec {
...
private static String inputXML;
...
public EXICodec()
{
System.out.println("Constructor");
this.inputXML = "string";
...
}
...
public static void setInputXML(String inXML)
{
inputXML = inXML;
}
...
public static String getInputXML()
{
return inputXML;
}
下面是C++
代码的摘要,用来与这个类交互:
JavaInterface.hh
class JavaInterface
{
private:
JNIEnv* JNIEnvironment;
JavaVM* javaVM;
jclass javaClass;
jobject javaClassInstance;
jmethodID IDconstructor;
jmethodID IDsetInputXML;
jmethodID IDgetInputXML;
public:
JavaInterface();
void init_context( void);
void init_class( void);
void init_methods( void);
void setInputXML( std::string);
std::string getInputXML( void);
}
JavaInterface.cc
void JavaInterface::init_context(){..} //initiate the JNIEnvironment & javaVM attributes
void JavaInterface::init_class(){..} //initiate the javaClass attribute
void JavaInterface::init_methods()
{
this->IDconstructor = this->JNIEnvironment->GetMethodID(this->javaClass, "<init>", "()V");
if (this->IDconstructor == NULL)
{
throw std::runtime_error("JAVA_INIT_METHOD_EXCEPTION");
}
this->IDsetInputXML = this->JNIEnvironment->GetStaticMethodID(this->javaClass, "setInputXML", "(Ljava/lang/String;)V");
if (this->IDsetInputXML == NULL)
{
throw std::runtime_error("JAVA_INIT_METHOD_EXCEPTION");
}
this->IDgetInputXML = this->JNIEnvironment->GetStaticMethodID(this->javaClass, "getInputXML", "()Ljava/lang/String;");
if (this->IDgetInputXML == NULL)
{
throw std::runtime_error("JAVA_INIT_METHOD_EXCEPTION");
}
}
void JavaInterface::j_constructor()
{
this->javaClassInstance = this->JNIEnvironment->NewObject(this->javaClass, this->IDconstructor);
if (this->javaClassInstance == NULL)
{
throw std::runtime_error("JAVA_CONSTRUCTOR_CALL_EXCEPTION");
}
}
void JavaInterface::j_setInputXML( std::string str)
{
jstring argument = this->JNIEnvironment->NewStringUTF(str.c_str());
this->JNIEnvironment->CallVoidMethod(this->javaClassInstance, this->IDsetInputXML, argument);
}
std::string JavaInterface::j_getInputXML()
{
jstring javaString = NULL;
// ---> PROBLEM HERE : javaString is still NULL after the line below : <---
javaString = (jstring)this->JNIEnvironment->CallObjectMethod(this->javaClassInstance, this->IDgetInputXML, 0);
// jString to char*
const char *nativeString = this->JNIEnvironment->GetStringUTFChars(javaString, JNI_FALSE);
// char* to std::string
std::string str(nativeString);
this->JNIEnvironment->ReleaseStringUTFChars(javaString, nativeString);
return str;
}
所以我的问题是CallObjectMethod
的调用不返回任何东西。我试图将Java方法更改为static
,但它没有改变。
更一般地说,如何从Java
返回C++
的字符串?
所以,很抱歉花了这么长时间,但我已经解决了问题。基本上,这是一个小错别字造成的混乱(至少在您的MWE中):
this->IDgetString = this->JNIEnvironment->GetStaticMethodID(this->javaClass
, "getString"
, "(()Ljava/lang/String;");
// ^ This parenthesis must be removed.
此外,我注意到您没有初始化对象。我重构了你的代码,使用实例方法而不是静态方法,对我来说,MWE运行良好。
下面是EXICodec.java
的代码,下面是JavaInterface.cpp
的代码。
我又看了一遍你的原始代码,发现了一些别的东西。
void JavaInterface::init_methods()
{
this->IDconstructor = this->JNIEnvironment->GetMethodID(this->javaClass, "<init>", "()V");
if (this->IDconstructor == NULL)
{
throw std::runtime_error("JAVA_INIT_METHOD_EXCEPTION");
}
this->IDsetInputXML = this->JNIEnvironment->GetStaticMethodID(this->javaClass, "setInputXML", "(Ljava/lang/String;)V");
if (this->IDsetInputXML == NULL)
{
throw std::runtime_error("JAVA_INIT_METHOD_EXCEPTION");
}
this->IDgetInputXML = this->JNIEnvironment->GetStaticMethodID(this->javaClass, "getInputXML", "()Ljava/lang/String;");
//} <- This brace must be further down
if (this->IDgetInputXML == NULL)
{
throw std::runtime_error("JAVA_INIT_METHOD_EXCEPTION");
}
} // <- To here
我确信这只是一个打字错误,但如果不是,它可能是你原来的例子中出现问题的原因。
相关文章:
- C 字符串返回字符串的整数/双精度/长整型值
- std::hash<std::string> 可以为不同的字符串返回相同的值吗?
- Java 调用 dll 字符串返回类型方法
- 返回具有C++字符串返回值的函数的本地 C 字符串
- 如何将两个 jlong 数据类型转换为 jstring,然后将两个字符串连接在一起以便从 JNI 将字符串返回给 jav
- 尝试以随机字符(长读取)打印字符串返回结果
- 从字符串返回 i(索引)字
- 函数读取最大和min int值,并用文本字符串返回
- 如何将 YAML 节点中的序列作为字符串返回?
- 将注册表项读取为字符串返回数值
- 为什么我在尝试打印字符串返回时收到编译器错误?
- 使用 char*array 存储条形图的条形图,以便我可以动态制作它并作为字符串返回
- 字符串返回功能不起作用 - 'identifier is underfined'
- 将C 本地字符串返回到另一个功能
- 在MATLAB中仅接受INT32PTR时,将错误编号作为字符串返回
- 字符串流到字符串返回
- 字符串返回错误的长度
- 从共享指针矢量字符串返回值
- C++随机字符串返回意外结果
- 临时标准::字符串返回垃圾