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
");

    // 获取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'