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 "); // 获取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' '问题 wstring wstr01((const wchar_t *)jstr01, iLen); // ZC: 从打印的信息可以看到 wstring的此种构造函数是拷贝字符串,并非直接使用字符串指针 printf("01 ==> %d , %S , %S , 0x%08X, 0x%08X ", 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' '问题 wstring wstr02((const wchar_t *)jstr02, iLen); printf("02 ==> %d , %S , %S , 0x%08X, 0x%08X ", 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+1]; // C++中字符串以' '结尾,不然会输出意想不到的字符 jstr[len] = L'