Java JNI C++ ログファイル生成される
お世話になっております。
以前も何度か似たような質問をさせて頂いたのですが
未だ解決に至りませんので、再度質問させていただきます。
現在、JavaからC++の自作dllを呼び出し、
C++dllから外部開発dllの関数を使いハードウェアへコマンドを送信する。
というプログラムを開発しております。
そこで、プログラムを動かし、終了させると
hs_pid...log が生成されます。
ログの内容(一部)↓
#
# A fatal error has been detected by the Java Runtime Environment:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x1a212cd2, pid=4716, tid=4332
#
# JRE version: 7.0_05-b05
# Java VM: Java HotSpot(TM) Client VM (23.1-b03 mixed mode windows-x86 )
# Problematic frame:
# C [PCardRW32.dll+0x22cd2] crwSetLineControl+0x203b2
#
# Failed to write core dump. Minidumps are not enabled by default on client versions of Windows
#
# An error report file with more information is saved as:
# C:\eclipse\workspace\ReWriteCard\hs_err_pid4716.log
#
# If you would like to submit a bug report, please visit:
# http://bugreport.sun.com/bugreport/crash.jsp
#
どうやら、メモリアクセス違反を起こしているみたいなのですが
logの内容は理解できません。
そこで、私が開発しましたプログラムを見て頂き、
BSTRの使い方がおかしいとのご指摘を受け、
しばらく調べていたのですが、どうにも改善できません。
C++のプログラム↓
JNI002_API jstring JNICALL Java_rewritecard_JNI001_DT(JNIEnv *env, jobject obj, jint jport) {
int port = (int)jport;
long int ret = 0;
test = crwOpenPort(port, 9600 , "8" , "N");
BSTR s1 = ::SysAllocString(L"s1");
BSTR s2 = ::SysAllocString(L"s2");
BSTR s3 = ::SysAllocString(L"s3");
ret = crwSendCommandRR(port,1,1000,1000,0,"DT",":1",2,&s1,&s2,&s3);
char* src = (char*)s3;
jstring jstr = env->NewStringUTF(src);
::SysFreeString(s1);
::SysFreeString(s2);
::SysFreeString(s3);
return jstr;
}
上記のプログラムのBSTRの使い方が悪いのは、承知致しておりますが
WideCharToMultiByte関数を使い、jstrへ変換し、
いかなる方法を試してもJava上で文字化けしますので
とりあえず今は現状で使用しております。
そこで試しに、以下のようなプログラムにしてみました
これだと、logファイルは生成されません。
JNI002_API jstring JNICALL Java_rewritecard_JNI001_DT(JNIEnv *env, jobject obj, jint jport) {
int port = (int)jport;
long int ret = 0;
/*
test = crwOpenPort(port, 9600 , "8" , "N");
BSTR s1 = ::SysAllocString(L"s1");
BSTR s2 = ::SysAllocString(L"s2");
BSTR s3 = ::SysAllocString(L"s3");
ret = crwSendCommandRR(port,1,1000,1000,0,"DT",":1",2,&s1,&s2,&s3);
char* src = (char*)s3;
jstring jstr = env->NewStringUTF(src);
::SysFreeString(s1);
::SysFreeString(s2);
::SysFreeString(s3);
*/
jstring jstr = env->NewStringUTF("");
return jstr;
}
しかし、以下のようにすると
logファイルが生成されます。
JNI002_API jstring JNICALL Java_rewritecard_JNI001_DT(JNIEnv *env, jobject obj, jint jport) {
int port = (int)jport;
long int ret = 0;
test = crwOpenPort(port, 9600 , "8" , "N");
/*
BSTR s1 = ::SysAllocString(L"s1");
BSTR s2 = ::SysAllocString(L"s2");
BSTR s3 = ::SysAllocString(L"s3");
ret = crwSendCommandRR(port,1,1000,1000,0,"DT",":1",2,&s1,&s2,&s3);
char* src = (char*)s3;
jstring jstr = env->NewStringUTF(src);
::SysFreeString(s1);
::SysFreeString(s2);
::SysFreeString(s3);
*/
jstring jstr = env->NewStringUTF("");
return jstr;
}
だとすると、logとBSTRの問題は別物だと判断してもいいんでしょうか
また、Java → 自作dll → 他社dll という構図に問題があるんでしょうか
ささいなことでも構いません
ご教授宜しくお願い致します。
お礼
お世話になっております。 しばらく調べさせていただき、わかったことは ・BSTRの操作は無関係 ・他社製dllのメモリアクセス違反 ということです。 dllを開発された企業に問合せを行ったところ、 Javaには対応していないのでわかりかねる。 との回答を頂き、これ以上良くなることはないかと考えております。 どこで何がアクセス違反を起こしているのかは、今後調べて参りますが 大変難しい作業であると思います。 お忙しい中ご回答頂きまして、大変ありがとうございました。 これに懲りず、また質問させて頂きますので 今後共宜しくお願い致します。