Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将javaapi扩展到C++;通过JNI:如何包装返回字符串的方法?_Java_C++_Java Native Interface - Fatal编程技术网

将javaapi扩展到C++;通过JNI:如何包装返回字符串的方法?

将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

我使用JNI来扩展java中的API,以便通过C++来访问它(我正在创建包装类)。我在java方面很有经验,但是C++新手。p>

现在,我在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;
}