gpt4 book ai didi

java - CallObjectMethod 不返回字符串

转载 作者:太空狗 更新时间:2023-10-29 21:18:15 27 4
gpt4 key购买 nike

我的目标是创建一个 Java 的实例在 C++ 中上课, 然后调用 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.

此外,我注意到您没有初始化对象。我重构了你的代码以使用 instace 方法而不是静态方法,对我来说,MWE 运行良好。

Here是我使用的 EXICodec.java 的代码和 hereJavaInterface.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

我确定这只是一个拼写错误,但如果不是,则可能是您原始示例中出现问题的原因。

关于java - CallObjectMethod 不返回字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30524695/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com