#include "JniInvoke.h"
#include <jni.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
jstring toJstring( JNIEnv* env, char* str )
{
const char* pat = str; //str为输入参数
//定义java String类 strClass
jclass strClass = (*env)->FindClass(env,"Ljava/lang/String;");
//获取java String类方法String(byte[],String)的构造器,用于将本地byte[]数组转换为一个新String
jmethodID ctorID = (*env)->GetMethodID(env,strClass, "<init>", "([BLjava/lang/String;)V"); jbyteArray bytes = (*env)->NewByteArray(env,strlen(pat));//建立byte数组
(*env)->SetByteArrayRegion(env,bytes, 0, strlen(pat), (jbyte*)pat);//将char* 转换为byte数组 jstring encoding = (*env)->NewStringUTF(env,"GB2312"); // 设置String, 保存语言类型,用于byte数组转换至String时的参数
return (jstring)(*env)->NewObject(env,strClass, ctorID, bytes, encoding);//将byte数组转换为java String,并输出
}
JNIEXPORT jstring JNICALL Java_com_test_jni_JniInvoke_send01Msg(JNIEnv * env, jclass jobject , jstring st1,jstring st2, jstring st3, jstring st4, jstring st5, jstring st6)
{ char arr[10000],str1[10000];
FILE *fp=NULL;
fp=fopen("/usr/local/test.txt","r");
if (fp!=NULL)
{
while(!feof(fp))
{
fgets(str1,10000,fp);
strcat(arr,str1); }
fclose(fp);
} char * str ; jstring jstr;
// str=(char*)(*env)->GetStringUTFChars(env,st1, NULL);
//jstr=(*env)->NewStringUTF(env, arr);jstr = toJstring(env, arr);
return jstr;
}
以上是我的jni 的C源码。测试中发现,第一次执行时可以正确的打印出中文。在调用一次send01Msg 中文字符串前面就会出乱码。。测试3次显示结果为:
s1:测试中文字符串
测试结束
s1:??W??
先Kj7x=I??????%??馐灾形淖址????测试结束
s1:??W??
先Kj7x=I??????%??馐灾形淖址????测试结束测试中文字符串
测试结束。还有个问题就是 char * str ; 这句话如果我不加,第一次执行测试就会出错。
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货