1、VC6(CPP)的DLL代码:

#include<stdio.h>
#include "jniZ_JNIjw04.h"
#include <string>
#include <algorithm>
using namespace std; JNIEXPORT void JNICALL Java_jniZ_JNIjw04_CallCppFunction (JNIEnv * env, jobject obj)
{
printf("Java_jniZ_JNIjw04_CallCppFunction - 1\n"); // 获取obj中对象的class对象
jclass clazz = env->GetObjectClass(obj); // 获取java中的属性:msg
jfieldID fid_msg = env->GetFieldID(clazz, "msg", "Ljava/lang/String;");
// 获取属性msg的对象
jstring j_msg = (jstring)env->GetObjectField(obj, fid_msg); jsize iLen = env->GetStringUTFLength(j_msg); // ZC: 添加byZC // 第一种方式 START
// 获取字符串指针
const jchar * jstr01 = env->GetStringChars(j_msg, NULL);
// 转换成宽字符串
//wstring wstr01((const wchar_t *)jstr01); // ZC: 尾部 非L'\0'问题
wstring wstr01((const wchar_t *)jstr01, iLen);
// ZC: 从打印的信息可以看到 wstring的此种构造函数是拷贝字符串,并非直接使用字符串指针
printf("01 ==> %d , %S , %S , 0x%08X, 0x%08X\n", iLen, jstr01, wstr01.c_str(), jstr01, wstr01.c_str());
// 释放指针
env->ReleaseStringChars(j_msg, jstr01);
// 第一种方式 STOP // 第二种方式 START
// 获取字符串指针
const jchar * jstr02 = env->GetStringCritical(j_msg, NULL);
// 转换成宽字符串
//wstring wstr02((const wchar_t *)jstr02); // ZC: 尾部 非L'\0'问题
wstring wstr02((const wchar_t *)jstr02, iLen);
printf("02 ==> %d , %S , %S , 0x%08X, 0x%08X\n", iLen, jstr02, wstr02.c_str(), jstr02, wstr02.c_str());
// 释放指针
env->ReleaseStringCritical(j_msg, jstr02);
// 第二种方式 STOP // 第三种方式 START
// 获取字符串的长度
jsize len = env->GetStringLength(j_msg);
// 生成长度为len的字符串指针
jchar *jstr = new jchar[len+];
// C++中字符串以'\0'结尾,不然会输出意想不到的字符
jstr[len] = L'\0'; // ZC: 注意这里是 宽字符
// 将字符串 j_msg复制到jstr中
env->GetStringRegion(j_msg, , len, jstr);
// 转换成宽字符串
wstring wstr((const wchar_t*)jstr);
// 释放指针
delete[] jstr;
// 第三种方式 STOP // 将字符串进行倒序
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); printf("Java_jniZ_JNIjw04_CallCppFunction - 2\n");
}

2、Java代码:

package jniZ;

import java.io.BufferedReader;
import java.io.InputStreamReader; public class JNIjw04
{
//定义一个本地方法
public native void CallCppFunction(); //定义一个String属性
public String msg = null; public static void main(String[] args)throws Exception
{
//调用动态链接库
System.loadLibrary("JNIjwVC6_04");
//从控制台中获取值
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String str = reader.readLine();
JNIjw04 jni04 = new JNIjw04();
jni04.msg = str;
jni04.CallCppFunction();
System.out.println(jni04.msg);
}
}

3、Java控制台输出:

ZC:  控制台信息中,第1行 是我的输入信息。"02 ==> "开头的这一行信息中,可以看到 返回的Unicode字符串 尾部非L'\0'问题(这一行信息中 字符串里面有一个乱码字符,然后后面才是L'\0')。

4、

5、

JNIjw04的更多相关文章

随机推荐

  1. ubuntu 安装低版本firefox

    firefox 57以后很多插件不支持了,ubuntu16自带火狐版本59,想换回56. 1.下载想换回的版本 https://ftp.mozilla.org/pub/mozilla.org/fire ...

  2. Linux文档编辑 vim

  3. MVC4 WebAPI中如何返回一张图片

    public HttpResponseMessage Get(string imageName, int width, int height) { Image img = GetImage(image ...

  4. info 手册

      info flex 可以查看flex帮助. h就可以看到相关命令,常用命令已经加粗: x           关闭此帮助窗口. q           一并退出 Info. RET         ...

  5. 小程序wxParse插件的使用

    微信小程序输出html内容数据插件wxParse,可以把带html标签的数据输出为微信小程序正常显示的格式,wxParse插件带有演示,也有使用文档说明. 下载地址:https://github.co ...

  6. java File delete() 失败,又没有报错。

    因为该文件流还没关闭,就执行了delete(),所以删除失败. 先举几个可以删除掉文件和删除不掉文件的例子(先在F盘创建test1.txt文件,然后可以直接拷贝代码到IDE执行),最后总结下原因: 例 ...

  7. 总结! http post请求 application/x-www-form-urlencoded body体数据获取不到?

    首先,简单介绍下Http请求中Content-Type类型 类型格式:type/subtype(;parameter)? type 主类型,任意的字符串,如text,如果是*号代表所有: subtyp ...

  8. python通过原生sql查询数据库(共享类库)

    #!/usr/bin/python # -*- coding: UTF-8 -*- """DB共享类库""" # 使用此类,先实例化一个Da ...

  9. CF 558 C. Amr and Chemistry 暴力+二进制

    链接:http://codeforces.com/problemset/problem/558/C C. Amr and Chemistry time limit per test 1 second ...

  10. 利用VMware克隆 windows 虚拟机需要注意的事项

    利用VMware克隆windows虚拟机需要注意的事项--克隆虚拟机 --powershell 在域服务器使用,查看所有的sid dsquery computer|dsget computer -dn ...