将javaapi扩展到C++;通过JNI:如何包装返回字符串的方法?
我使用JNI来扩展java中的API,以便通过C++来访问它(我正在创建包装类)。我在java方面很有经验,但是C++新手。p>将javaapi扩展到C++;通过JNI:如何包装返回字符串的方法?,java,c++,java-native-interface,Java,C++,Java Native Interface,我使用JNI来扩展java中的API,以便通过C++来访问它(我正在创建包装类)。我在java方面很有经验,但是C++新手。p> 现在,我在C++中为java函数GestString()返回了一个包装器,它返回一个字符串。我正在使用GetStringUTFChars从Java字符串中获取C字符串,但我不知道在哪里使用ReleaseStringUTFChars来释放C字符串。下面是我的代码(aClass和aclasinstance是包装类中的私有日期成员): const char*getStrin
现在,我在C++中为java函数GestString()返回了一个包装器,它返回一个字符串。我正在使用GetStringUTFChars从Java字符串中获取C字符串,但我不知道在哪里使用ReleaseStringUTFChars来释放C字符串。下面是我的代码(aClass和aclasinstance是包装类中的私有日期成员):
const char*getString(){
jmethodID=env->GetMethodID(aClass,
“方法名”,
“()Ljava/lang/String;”;
if(methodID==NULL){
cout CallObjectMethod(aclasstance,methodID);
const char*result=env->GetStringUTFChars(jstringResult,NULL);
//env->ReleaseStringUTFChars(jstringResult,结果);
返回结果;
}
如果我删除//并使用ReleaseStringUTFChars,结果将被释放,并且我将无法再返回它,对吗?在释放结果之前是否应该将其复制到另一个字符数组
谢谢,欢迎任何帮助
马赫什是对的
std::string getString()
{
jmethodID methodID = env->GetMethodID(aClass,
"methodName",
"()Ljava/lang/String;");
if (methodID == NULL)
{
cout << "--methodID = NULL";
exit(0);
}
jstring jstringResult = (jstring) env->CallObjectMethod(aClassInstance, methodID);
const char* result = env->GetStringUTFChars(jstringResult, NULL);
std::string result2(result);
env->ReleaseStringUTFChars(jstringResult, result);
return result2;
}
std::string getString()
{
jmethodID=env->GetMethodID(aClass,
“方法名”,
“()Ljava/lang/String;”;
if(methodID==NULL)
{
cout CallObjectMethod(aclasstance,methodID);
const char*result=env->GetStringUTFChars(jstringResult,NULL);
std::字符串result2(result);
env->ReleaseStringUTFChars(jstringResult,结果);
返回结果2;
}
STD::String为您复制字符,必要时自动释放。使用C++中的原始指针通常是不赞成的。从java来,您可能对它们可能引起的问题一无所知。
< P>最明显的地方调用<代码> RelaseStutuutufCARS/<代码>在您的包装类“析构函数”中。使用<代码>ctor或其他一些容器来记录访问的每个jstring,然后在包装类的析构函数中,对容器中的每个元素调用ReleaseStringUTFChars
。如果您的客户机的寿命比包装类对象长,则需要复制字符数据。如果可能,请使用std::string。@Mahesh WhY?const char不是问题,使用ReloStayutuchCar是我的问题。我不会说使用指针是不赞成的。我宁愿说它们不是最佳实践。使用指针可以使程序更干净。我也不认为OP不熟悉/擅长C++。仅仅因为它们使用java并不意味着它们只知道。Java.Thanx John。这或多或少是我所想的,它也适用于字符数组。同时具有result和result2似乎很愚蠢,但我想这是唯一的方法,因为返回之前需要释放result。我不知道不使用原始指针,我会采用它。@AndréCaron我还没有看到使用char*比 STD::String >更干净。即使在C中,即使没有必要,也不必处理本地字符数组——Kostis的编译程序实际上有足够的库。如果C++编译器不能转换代码,它实际上可以创建至少两个字符串(它可以);
std::string getString()
{
jmethodID methodID = env->GetMethodID(aClass,
"methodName",
"()Ljava/lang/String;");
if (methodID == NULL)
{
cout << "--methodID = NULL";
exit(0);
}
jstring jstringResult = (jstring) env->CallObjectMethod(aClassInstance, methodID);
const char* result = env->GetStringUTFChars(jstringResult, NULL);
std::string result2(result);
env->ReleaseStringUTFChars(jstringResult, result);
return result2;
}