JNI程序中的jstring返回

Posted

技术标签:

【中文标题】JNI程序中的jstring返回【英文标题】:jstring return in JNI program 【发布时间】:2012-11-27 14:53:36 【问题描述】:

这是 JNI 代码。

Java 代码:

public class Sample1 
 
    public native String stringMethod(String text);
    
    public static void main(String[] args)
    
       System.loadLibrary("Sample1");
       Sample1 sample = new Sample1();
    
       String  text   = sample.stringMethod("world");
    
       System.out.println("stringMethod: " + text);    
   

stringMethod函数的Cpp方法:

JNIEXPORT jstring JNICALL Java_Sample1_stringMethod
   (JNIEnv *env, jobject obj, jstring string) 
   
 const char *name = env->GetStringUTFChars(string, NULL);//Java String to C Style string
 char msg[60] = "Hello ";
 jstring result;

 strcat(msg, name);
 env->ReleaseStringUTFChars(string, name);
 puts(msg);
 result = env->NewStringUTF(msg); // C style string to Java String
 return result;    
 

运行我的 java 代码时。我得到了下面的结果。

stringMethod: world

但是我在字符串“world”后面加上了“Hello”。我也在这里返回附加的字符串。但是为什么我只得到“世界”而不是“Hello World”。真的我对这段代码感到困惑。我应该怎么做才能得到附加字符串的结果?

【问题讨论】:

问题出在其他地方,您的串联完全有效:codepad.org/WWR4LzfV 【参考方案1】:
JNIEXPORT jstring JNICALL Java_Sample1_stringMethod
    (JNIEnv *env, jobject obj, jstring string) 
    
    const char *name = (*env)->GetStringUTFChars(env,string, NULL);
    char msg[60] = "Hello ";
    jstring result;
    
    strcat(msg, name);  
    (*env)->ReleaseStringUTFChars(env,string, name);   
    puts(msg);            
    result = (*env)->NewStringUTF(env,msg); 
    return result;        

【讨论】:

嗯,我看到你的代码和作者的代码之间的唯一区别是他对 JNI 使用 C++ 语法,而你对 JNI 使用 C 语法...... 应该(*env)->NewStringUTF(...)env->NewStringUTF(...) @nn0p 在c中使用env函数时,语句为(*env)->Function(env, parameters)。然而在 c++ 中,这变成:env->Function(parameters).【参考方案2】:

有几种方法,但最好的方法是将const char * 转换为 c++ 字符串,然后转换为 jbyteArray,并且在 java 端将 byteArray 转换为 UTF-8 很容易。

C++ 方面:

const char* string = propertyValue;
std::string str = string;

jbyteArray array = env->NewByteArray(str.length());
env->SetByteArrayRegion(array,0,str.length(),(jbyte*)str.c_str());


return array;

Java/kotlin 方面:

String((array), Charset.defaultCharset()))

【讨论】:

以上是关于JNI程序中的jstring返回的主要内容,如果未能解决你的问题,请参考以下文章

c用法中的jstring到char *未转换为可打印格式

JAVA/JNI的jstring转换为char*

求指教,C++编写JNI中jobect和jstring如何类型转换

jni jstring类型与c++字符串类型相互转换

Java jni字符串转换

C++ jstring to string (UTF16->UTF8)