use*_*330 11 c++ java java-native-interface
是否有必要将char*转换为jbyteArray,然后调用java String的构造函数来生成jstring?怎么办呢?请帮忙.
static int testhandler(void *arg, ...)
{
int i;
struct callback *cb = (struct callback *)arg;
JNIEnv *env = cb->env;
char *sig = cb->signature;
jint size = (jint) strlen(sig);
jint size1;
va_list arguments;
jobjectArray return_array;
jclass obj_class;
jbyteArray bytes;
jstring str;
obj_class = (*env)->FindClass(env, "java/lang/Object");
return_array = (*env)->NewObjectArray(env, size, obj_class, NULL);
va_start(arguments, arg);
for (i = 0; i < size; i++) {
jclass clazz;
jmethodID id;
jobject obj;
jobject encoding;
switch (sig[i]) {
case 'i': {
clazz = (*env)->FindClass(env, "java/lang/Integer");
id = (*env)->GetMethodID(env, clazz, "<init>", "(I)V");
obj = (*env)->NewObject(env, clazz, id, va_arg(arguments, uint32_t));
(*env)->SetObjectArrayElement(env, return_array, i, obj);
break;
}
case 'l': {
clazz = (*env)->FindClass(env, "java/lang/Long");
id = (*env)->GetMethodID(env, clazz, "<init>", "(J)V");
obj = (*env)->NewObject(env, clazz, id, va_arg(arguments, uint64_t));
(*env)->SetObjectArrayElement(env, return_array, i, obj);
break;
}
case 's': {
clazz = (*env)->FindClass(env, "java/lang/String");
size1 = (jint) strlen(va_arg(arguments, char *));
id = (*env)->GetMethodID(env, clazz, "<init>", "([BLjava/lang/String;)V");
encoding = (*env)->NewStringUTF(env, va_arg(arguments, char *));
bytes = (*env)->NewByteArray(env, size1);
(*env)->SetByteArrayRegion(env, bytes, 0, size1, (jbyte *)(va_arg(arguments, char *)));
str = (jstring)(*env)->NewObject(env, clazz, id , bytes);
obj = (*env)->NewObject(env, clazz, id, str);
(*env)->SetObjectArrayElement(env, return_array, i, obj);
break;
}
default: {
printf("unknown signature char '%c'\n", sig[i]);
}
}
}
va_end(arguments);
(*env)->CallVoidMethod(env, cb->handler, cb->id, return_array);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
mka*_*aes 34
您可以查看JNI api文档.如这里.
你会找到:
jstring NewStringUTF(JNIEnv *env, const char *bytes);
Run Code Online (Sandbox Code Playgroud)
所以你必须这样做:
char *buf = (char*)malloc(10);
strcpy(buf, "123456789"); // with the null terminator the string adds up to 10 bytes
jstring jstrBuf = (*env)->NewStringUTF(env, buf);
Run Code Online (Sandbox Code Playgroud)
这取决于你的char *字符串的性质.NewStringUTF从0端接,修改的UTF-8 Unicode字符编码复制. NewString从计数的UTF-16 Unicode字符编码中复制.如果您没有其中任何一个,则必须执行转换.
使用大量代码时NewStringUTF假设字符串是以NUL结尾的ASCII.如果该假设是正确的,那么它将起作用,因为修改的UTF-8编码和ASCII编码将产生相同的字节序列.应明确注释此类代码以记录对字符串数据的限制.
您提到的调用Java函数的转换方法(例如String(byte [] bytes,Charset charset)) - 是一个很好的方法.另一种选择(在Windows中,我看到你使用的是Visual Studio)是MultiByteToWideChar.另一种选择是iconv.
结论:您必须知道字符串使用的字符集和编码,然后将其转换为UTF-16编码的Unicode以用作Java字符串.
| 归档时间: |
|
| 查看次数: |
42779 次 |
| 最近记录: |