如果上层传入 String str = "123456";
在 JNI 层用 GetStringChars 方法取到的字符串被截断了,只有第一个数字 1,请问这个怎么解决?代码如下:
------------------- Android --------------------
package com.test;
import com.test.R;
import android.app.Activity;
import android.os.Bundle;
public class T9py extends Activity {
public static native void addPhone(String str);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
System.loadLibrary("t9py");
addPhone("123456");
}
}
---------------------- JNI -----------------------
extern "C" void Java_com_test_T9py_addPhone(JNIEnv* env, jobject thiz, jstring jphone)
{
const char *ps8Phone = NULL;
ps8Phone = (char *)env->GetStringChars(jphone, 0);
__android_log_print(ANDROID_LOG_WARN, "test", "%s, len = %d", ps8Phone, strlen(ps8Phone));
env->ReleaseStringChars(jphone, (jchar *)ps8Phone);
}
logcat 输出信息是:
1, len = 1
------解决方案--------------------
const jchar * GetStringChars (JNIEnv*env, jstring string, jboolean *isCopy);
功能:返回指向字符串的 Unicode 字符数组的指针。该指针在调用 ReleaseStringchars() 前一直有效。
如果 isCopy 非空,则在复制完成后将 *isCopy 设为 JNI_TRUE。如果没有复制,则设为JNI_FALSE。
参数: env:JNI 接口指针。
string:Java 字符串对象。
isCopy:指向布尔值的指针。
返回值: 指向 Unicode 字符串的指针,如果操作失败,则返回NULL。
------解决方案--------------------
数字转成 unicode 之后有一个字节为 0,而 __android_log_print 遇到 0 就停止打印了(类似 c 语言的 printf,因为 c 语言的字符串是以 0 为结束的),所以没有打印完整。