#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 ; 这句话如果我不加,第一次执行测试就会出错。