日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

java 调用 dll 乱码_java调用c++ dll出现中文乱码

發(fā)布時間:2024/4/13 c/c++ 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 调用 dll 乱码_java调用c++ dll出现中文乱码 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

最近的開發(fā)用到了使用java調(diào)用本機動態(tài)連接庫的功能,將文件路徑通過java調(diào)用C++代碼對文件進行操作。在調(diào)用中如果路徑中包含有中文字符就會出現(xiàn)問題,程序運行就會中止。下面用一個小例子,來說明記錄下解決的方法。

java中傳入一個字符串,調(diào)用c++代碼將字符串輸出

public class CommonUtil

{

static

{

System.loadLibrary("nativeTest");

}

public native static void Print(String str);

public static void main(String args[])

{

CommonUtil.Print("中文亂碼");

}

}

執(zhí)行javac CommonUtil.java和javah CommonUtil兩條命令。會生成一個CommonUtil.h的c++頭文件。CommonUtil.h的源碼如下

/* DO NOT EDIT THIS FILE - it is machine generated */

#include

/* Header for class CommonUtil */

#ifndef _Included_CommonUtil

#define _Included_CommonUtil

#ifdef __cplusplus

extern "C" {

#endif

/*

* Class: CommonUtil

* Method: Print

* Signature: (Ljava/lang/String;)V

*/

JNIEXPORT void JNICALL Java_CommonUtil_Print

(JNIEnv *, jclass, jstring);

#ifdef __cplusplus

}

#endif

#endif

使用vs2005新建一個c++ dll的工程,將CommonUtil.h加入到項目中,再新建一個.cpp文件,用于實現(xiàn)Java_CommonUtil_Print這個函數(shù),實現(xiàn)代碼如下:

#include "CommonUtil.h"

#include

using namespace std;

JNIEXPORT void JNICALL Java_CommonUtil_Print

(JNIEnv *env, jclass obj, jstring jStr)

{

const char *localStr = env->GetStringUTFChars(jStr,NULL);

cout<

}在編譯中需要加入java自帶的c++頭文件,否則比如像JNIEnv這樣的類就會找不到,我用的是jdk1.6,所以了"C:\Program Files\Java\jdk1.6.0_10\include;C:\Program Files\Java\jdk1.6.0_10\include\win32"到項目屬性中。

編譯后生成一個dll,將dll拷到剛才編譯的.class所在的文件夾中(做為一個簡單的測試,沒有使用包,如果使用包情況會略有不同)。

執(zhí)行命令java CommonUtil輸出如下

現(xiàn)在還完全搞清楚出現(xiàn)亂碼的情況,不過網(wǎng)上有將java的utf編碼轉(zhuǎn)換成gb2312的代碼。下面是轉(zhuǎn)換的代碼,代碼來源:http://blog.csdn.net/yiyaaixuexi/article/details/6173592

char* jstringToWindows( JNIEnv *env, jstring jstr )

{ //UTF8/16轉(zhuǎn)換成gb2312

int length = (env)->GetStringLength(jstr );

const jchar* jcstr = (env)->GetStringChars(jstr, 0 );

char* rtn = (char*)malloc( length*2+1 );

int size = 0;

size = WideCharToMultiByte( CP_ACP, 0, (LPCWSTR)jcstr, length, rtn,(length*2+1), NULL, NULL );

if( size <= 0 )

return NULL;

(env)->ReleaseStringChars(jstr, jcstr );

rtn[size] = 0;

return rtn;

}將Java_CommonUtil_Print改成如下:

JNIEXPORT void JNICALL Java_CommonUtil_Print

(JNIEnv *env, jclass obj, jstring jStr)

{

char *localStr = jstringToWindows(env, jStr);

cout<

free(localStr);

}重新編譯,生成后的dll再拷到.class所在的文件夾中。

執(zhí)行java CommonUtil

運行正常

總結(jié)

以上是生活随笔為你收集整理的java 调用 dll 乱码_java调用c++ dll出现中文乱码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。