JNIjw04
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的更多相关文章
随机推荐
- centos7.3下使用yum 安装pip
centos下安装pip时失败: No package pip available.Error: Nothing to do 解决方法: 需要先安装扩展源EPEL. EPEL(http://fedor ...
- 网站行为跟踪 Website Activity Tracking Log Aggregation 日志聚合 In comparison to log-centric systems like Scribe or Flume
网站行为跟踪 Website Activity Tracking 访客信息处理 Log Aggregation 日志聚合 Apache Kafka http://kafka.apache.org/ ...
- Java 之反射机制
java 语言的反射机制 - 在运行状态中,对于任意一个类 (class 文件),都能够知道这个类的所有属性和方法; - 能动态获取类中的信息,也可以理解为对类(字节码文件)的解剖 描述字节码文件的类 ...
- 初识idea
http://blog.csdn.net/bitcarmanlee/article/details/54951589 http://blog.csdn.net/haishu_zheng/article ...
- Django的model模型
一:字段选项 1,null =True 表示数据库的中可以存为null 默认值是False 2,blank=True 表示字段可以为空 默认值是False 3,chioces 由二项元组构成的一 ...
- EJB远程客户端和本地客户端
在客户端中使用企业bean 企业bean的客户端通过依赖注入或JNDI查询的方式获得对企业bean实例的引用. 依赖注入是获得对企业bean实例的引用的最简便的方法. (紧耦合的bean之间相互依赖, ...
- python库numpy的reshape的终极解释
a = np.arange(2*4*4) b = a.reshape(1,4,4,2) #应该这样按反序来理解:最后一个2是一个只有2个元素的向量,最后的4,2代表4×2的矩阵,最 ...
- centos7 vmware克隆解决网络问题
centos7克隆后,发现两台机子之间的MAC相同,无法获取IP.超找资料,解决办法如下: 只要删除网卡的配置文件中的HWADDR和UUID两行就行.使用ifup启动网卡即可.
- sersync的confxml.xml文件详解
<?xml version="1.0" encoding="ISO-8859-1"?> <head version="2.5&quo ...
- Python(装饰器)
eval 内容从字符串中提取出来,用Python运行一遍__name__得到函数名字 闭包函数 定义: 函数内部定义的函数称为内部函数 该内部函数包含对外部作用域,而不是对全局作用域的名字的引用 那么 ...