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. 160715、在web.xml中注册IntrospectorCleanupListener解决Quartz等框架可能产生的内存泄露问题

    增加方式如下:web.xml中加入  <listener>    <listener-class>org.springframework.web.util.Introspect ...

  2. 【IDEA】本地新建Maven项目+配置Git和GitHub+代码上传和拉取到GitHub+其他IDEA和GitHub实战

    一.本地新建Maven项目并启动成功 1. 按照IDEA提供的模板,构建一个maven webapp的模板项目. 一路Next,到最后的finish.如下图. 2. 新建Tomcat,启动刚建立的项目 ...

  3. 烂笔头-Spring3

    1.spring相关jar包的导入 2.配置文件bean.xml <?xml version="1.0" encoding="UTF-8"?> &l ...

  4. PHP使用SimpleElement创建和解析xml文件

    <!-- 使用SimpleXMLElement生成xml文件 --><?php//生成一个xml文件 //xml字符串$_xml = <<<_xml<?xml ...

  5. 巨蟒python全栈开发-第22天 内置常用模块1

    一.今日主要内容 1.简单了解模块 你写的每一个py文件都是一个模块 数据结构(队列,栈(重点)) 还有一些我们一直在使用的模块 buildins 内置模块.print,input random 主要 ...

  6. C# 矩阵乘法实现

    矩阵乘法是一种高效的算法可以把一些一维递推优化到log( n ),还可以求路径方案等,所以更是是一种应用性极强的算法.矩阵,是线性代数中的基本概念之一.一个m×n的矩阵就是m×n个数排成m行n列的一个 ...

  7. C# WinForm 只运行一次的MDI子窗体

    public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void ToolColle ...

  8. bash短路径显示

    修改.bashrc文件vim 打开.bashrc文件,找到如下这行,有两个,都修改一下: PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ ' 将上面 ...

  9. 模块化之SeaJS(二)

    Seajs 此文来自 予舍驿站 提供简单.极致的模块化开发体验 非官方文档,整理来自己官方文档的文字与实例,方便速查. seajs.configObject aliasObject 别名配置,配置之后 ...

  10. Hibernate 处理事务

    1. Hibernate 的持久化类 1.1 什么是持久化类 持久化类: 就是一个 Java 类(JavaBean),这个 Java类与表建立了映射关系就可以是持久化类; 持久化类 = JavaBea ...