お世話になります。
.NET6.0 WindowsXP JBuilderで作成しております。
今テストプログラムで
java→DLL→C
で文字列を渡すテストをしてます。
現象:
java→DLL→javaなら文字列の受け渡しが正常
java→DLL→CだとNGです。
もらっている文字が"となっています。
以下にDLLのソースを記述します。
// JNIEXE.cpp : DLL アプリケーションのエントリ ポイントを定義します。
//
//#include <jni.h>
//#include stdafx.h
#include JNIProc.h
#include <stdlib.h>
#include <windows.h>
#include <ShellAPI.h>
#pragma comment(lib, shell32.lib)
#pragma data_seg(test)
char szSJIS[100];
#pragma data_seg()
char* __declspec(dllimport) __stdcall getStr();
char sz[100];
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}
JNIEXPORT void JNICALL Java_jnitest_JNIProc_sSetMessage
(JNIEnv *env, jclass, jstring message)
{
jsize nUniLength = env->GetStringLength(message);
const jchar* pszUnicode = env->GetStringChars(message, NULL);
::memset((void*)szSJIS, 0, sizeof(szSJIS));
WideCharToMultiByte(
CP_ACP,
0, //WC_SEPCHARS,
pszUnicode,
nUniLength,
szSJIS,
sizeof(szSJIS),
NULL,
NULL
);
env->ReleaseStringChars(message, pszUnicode);
}
JNIEXPORT jstring JNICALL Java_jnitest_JNIProc_sGetMessage
(JNIEnv *env, jclass)
{
WCHAR szWide[100];
::memset((void*)szWide, 0, sizeof(szWide));
int nWideLength = MultiByteToWideChar(
CP_ACP,
MB_PRECOMPOSED,
szSJIS,
strlen(szSJIS),
szWide,
sizeof(szWide) );
return env->NewString(szWide, nWideLength);
}
char* __declspec(dllexport) __stdcall getStr(){
strcpy(sz,szSJIS);
return sz;
}
原因がわかりません。経験のある方よろしくご教授願います。
ファイルマッピングオブジェクトをしようすればいいことがわかりました。