- #include
- #includecom_jni_demo_JNIDemo.h
- #includewindows.h
- #include
- #include
- using namespace std;
- JNIEXPORT void JNICALL Java_com_jni_demo_JNIDemo_callCppFunction (JNIEnv * env, jobject obj)
- {
- //获取java中的属性:msg
- jfieldID fid_msg = env->GetFieldID(env->GetObjectClass(obj),msg,Ljava/lang/String;);
- //获取属性msg的对象
- jstring j_msg = (jstring)env->GetObjectField(obj,fid_msg);
- /**第一种方式START*/
- /*
- //获得字符串指针
- const jchar* jstr = env->GetStringChars(j_msg,NULL);
- //转换成宽字符串
- wstring wstr((const wchar_t*)jstr);
- //释放指针
- env->ReleaseStringChars(j_msg,jstr);
- */
- /**第一种方式END*/
- /**第二种方式START*/
- /*
- //获取字符串指针
- const jchar* jstr = env->GetStringCritical(j_msg,NULL);
- //转换成宽字符串
- wstring wstr((const wchar_t*)jstr);
- //释放指针
- env->ReleaseStringCritical(j_msg,jstr);
- */
- /**第二种方式END*/
- /**第三种方式START*/
- //获取字符串的长度
- jsize len = env->GetStringLength(j_msg);
- //生成长度为len的字符串指针
- jchar* jstr = new jchar[len+1];
- //C++中字符串以''结尾,不然会输出意想不到的字符
- jstr[len] = L'';
- //将字符串j_msg复制到jstr中
- env->GetStringRegion(j_msg,0,len,jstr);
- //转换成宽字符串
- wstring wstr((const wchar_t*)jstr);
- //释放指针
- delete[] jstr;
- /**第三种方式END*/
- //将字符串进行倒序
- reverse(wstr.begin(),wstr.end());
- //获取倒序后新的字符串
- jstring j_new_str = env->NewString((const jchar*)wstr.c_str(),(jint)wstr.size());
- //将新的字符串设置变量中
- env->SetObjectField(obj,fid_msg,j_new_str);
- } 这里使用了三种方式实现功能。这里要注意的是还有一个方法就是将const jchar*转换成wstring,因为reverse方法接受的参数是wstring。在Eclipse中运行结果如下:

到这里这一篇的内容就讲到着了,后面的内容更精彩!
Java中JNI的使用详解第四篇:C/C++中创建Java对象和String字符串对象及对字符串的操作方法(二)
/定义一个String属性
public String msg = null;
public static void main(String[] args)throws Exception{
//调用动态链接库
System.loadLibrary(JNIDemo);
//从控制台中获取值
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String str = reader.readLine();
JNIDemo jniDemo = new JNIDemo();
jniDemo.msg = str;
jniDemo.callCppFunction();
System.out.println(jniDemo.msg);
}
} 在来看一下C++代码: [cpp] view plaincopy