JNI程序中的jstring返回

 2023-01-21    232  

问题描述

这是JNI代码.

java代码:

JNI程序中的jstring返回

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);    
   }
}

cpp方法用于字符串method函数:

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

但我用” Hello”附加了字符串”世界”.我也在这里返回附加的字符串.但是,为什么我只得到”世界”而不是” Hello World”.真的,我对此代码感到困惑.我该怎么做才能通过附加的字符串获得结果?

推荐答案

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;        
}

其他推荐答案

有几种方法,但是通过将const char *转换为C ++字符串然后转换为jbyteArray,我得到的最好的方法很容易转换为java side上的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返回,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://77isp.com/post/26331.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。