27

これは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」を追加しました。ここに追加された文字列も返します。しかし、なぜ私は「HelloWorld」ではなく「world」だけを取得しているのですか。本当に私はこのコードと混同しました。文字列を追加して結果を取得するにはどうすればよいですか?

4

2 に答える 2

22
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;        
}
于 2014-11-28T02:44:55.263 に答える
0

いくつかの方法がありますが、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()))
于 2019-12-16T06:06:57.753 に答える