• 締切済み

Java JNI C++リンク dll読み込まない

お世話になっております 何度も質問して申し訳ないですが、わかる方いらっしゃれば ご回答よろしくお願いいたします。 現在JavaでJNIを使用し、呼び出したC++からハードウェアへ 接続するというプログラムを開発しております。 その際、C++をdll形式にして、そのdllをJavaで呼び出すような形なのですが 私が使用しているコンピュータ(Windows 7)では、ハードウェアへの接続ができています。 コマンドを送信し、レスポンスを取得し、Javaのプログラムで表示ができます。 しかし、別のコンピュータ(Windows XP)で、開発したプログラムを実行すると dllを読み込む時点で下記のエラーが出てしまいます。 java.lang.UnsatisfiedLinkError: no JNI001 in java.library.path JNI001がC++で作成したdllです。 JNI001.dllは、実行したプログラムと同じフォルダにありますので、おかしいなと思いまして C:\Windows へ入れてみても結果は変わりません。 私が使っていたコンピュータのeclipseをまるまるコピーして実行しても効果なし。 環境変数も私のコンピュータとほとんど変わりません。 XPのJavaをインストールし直しても変わりません。 フォルダ階層やフォルダ名などチェックしましたが、7とXPで変わった点もないように思います。 そこで、少し気になったのですが、 現在開発中のプログラムは Java → JNI001.dll → ○○.dll → ハードウェア ○○.dllはハードウェアを動かすためのdllです。 上記の仕様に問題があるのでしょうか。 それでは私のコンピュータで接続できている理由がわからなくなりますが ・・・もう、なにもわかりません どうか、ご教授宜しくお願い致します。

みんなの回答

  • wormhole
  • ベストアンサー率28% (1621/5657)
回答No.1

>java.lang.UnsatisfiedLinkError: no JNI001 in java.library.path エラーメッセージを読む限り、「java.library.path に JNI001 がない」と書いてあるよう見えますけど。 他に考えられる事といえば、JNI001.dllや○○.dllに必要なランタイムライブラリがXP側にはインストールされていないとかではないでしょうか。

pokeman-v
質問者

お礼

ご回答ありがとうございます C++初心者のためランタイムライブラリ等わからないことばかりですので ランタイムライブラリについて詳しく調べてみます ありがとうございます

関連するQ&A

  • dll ⇒ 自作dl ⇒ Java

    お世話になっております。 何度も質問して申し訳ないですが、わかる方いらっしゃれば ご回答よろしくお願いいたします。 現在JavaでJNIを使用し、呼び出したC++からハードウェアへ 接続するというプログラムを開発しております。 その際、C++をdll形式にして、そのdllをJavaで呼び出すような形なのですが 私が使用しているコンピュータ(Windows 7)では、ハードウェアへの接続ができています。 コマンドを送信し、レスポンスを取得し、Javaのプログラムで表示ができます。 しかし、別のコンピュータ(Windows XP)で、開発したプログラムを実行すると dllを読み込む時点で下記のエラーが出てしまいます。 java.lang.UnsatisfiedLinkError: no JNI001 in java.library.path JNI001がC++で作成したdllです。 JNI001.dllは、実行したプログラムと同じフォルダにありますので、おかしいなと思いまして C:\Windows へ入れてみても結果は変わりません。 私が使っていたコンピュータのeclipseをまるまるコピーして実行しても効果なし。 環境変数も私のコンピュータとほとんど変わりません。 XPのJavaをインストールし直しても変わりません。 フォルダ階層やフォルダ名などチェックしましたが、7とXPで変わった点もないように思います。 そこで、少し気になったのですが、 現在開発中のプログラムは Java → JNI001.dll → ○○.dll → ハードウェア ○○.dllはハードウェアを動かすためのdllです。 上記の仕様に問題があるのでしょうか。 それでは私のコンピュータで接続できている理由がわからなくなりますが ・・・もう、なにもわかりません どうか、ご教授宜しくお願い致します。

  • JavaからJNIを使わず既存DLLを呼び出す

    現在、GeneXusというジェネレータで出力されたJavaコードを、GeneXusが使用しているフレームワークに依存しない形で解体する作業を行っております。 作業を進めていくうちに、こちらのシステムの内部にwin32DLLを呼び出している箇所があることに気づきました。 DLLの内部の処理がかなり重要な処理なのですが、現状どうにも手を出せない状態です。 JNIを使用してソースからDLLをコンパイルしなおせばUnsatisfiedLinkErrorを回避できることが分かったのですが、DLLのソースがないのでJNIでヘッダ情報などを生成することができない状況です。 ちなみに、DLLはとあるpackageからコールされており、そのpackageからなら問題なくコールできるようです。しかし私が新たに作成したコードから呼び出すと、やはりUnsatisfiedLinkErrorで「nativeメソッドが見つかりません」と言われます。 どうにか、既存のDLLをJavaから呼び出す方法はないでしょうか? もしくは、DLLの内部の処理を解析する方法はないでしょうか。 完全に行き詰っておりますので、何か案があればよろしくお願いいたします。

  • Cで作成したDLLをJNIから呼び出せない

    WindwosCEでC言語のDLLを作成してJNIから実行すると エラーになってしまいます。 ※C++で作成したApplicationからは呼び出せました ソールはこんな感じです・・・ ---------------------------------------------------------------- import java.util.*; public class CgiChk { public static void main(String[] args) throws Exception { System.loadLibrary("pimapi"); //既存のDll(\windows下)は読込める System.loadLibrary("TestDll");//自作のは読込めない } } 困っています。どなたか解決法のわかる方いらっしゃいますか。

  • Eclipseにdllがうまく読み込めない

    JNIを使った開発をしてdllを作りました。 コマンドプロンプト上ではうまく動くのですが、eclipseに取り込んで実行の構成から環境変数を入れましたが、 Exception in thread "Thread-0" java.lang.UnsatisfiedLinkError: controller.Joystick.getXPos(I)F at controller.Joystick.getXPos(Native Method) at controller.Joystick.getXPos(Joystick.java:45) at controller.ControllerSample.run(ControllerSample.java:20) と表示されうまくいきません。 どうしたらよろしいでしょうか?

    • ベストアンサー
    • Java
  • JavaからCプログラムを結合

    JavaからCプログラム・またCプログラムからJavaを実行する方法を模索しております。JNIというのが見つかったのですが、これは、C→Javaでも可能なのでしょうか? また、各異言語にて他言語の処理を実行した場合、戻り値やOUTパラメータなどの引継ぎは可能なのでしょうか? JNI以外の方法含め、ご存知の方いらっしゃいましたらご教授宜しくお願い致します。

  • Java hs_err_pid0000.log解析

    こんにちわ おわかりになる方、ご回答宜しくお願い致します。 現在、JavaでJNIを使用し、C++でdllを作成、C++のdllから他社製dll、他社製dllからハードウェア というようなプログラムを開発しております。 その際、Javaを実行し、ハードウェアとリンクして、終了すると hs_err_pid0000.logというログファイルが生成され、困っております。 このログファイルを解析しようと思い、解析方法を調べましたが 答えが見つからず、自力で翻訳してやってみましたがほとんど意味不明で、困っております 大変初歩的な質問だとは思いますが、 解析する際は、何を見たら良いんでしょうか。 また、何がどうなってたら異常な状態なんでしょうか。 お恥ずかしい限りですが、宜しくお願い致します

  • eclipse で JAVAもC++も開発したい

    C++をやっていて、最近JAVAもプログラムするようになったのですが、 JAVAで使うeclipseが非常に便利なので、これをC++で使えないかと思っています。 http://www.eclipse.org/downloads/ を見ると、JAVAを使うためのeclipseとC++を使うためのeclipseは別々に用意されているようなのですが、二つ eclipse をインストールするとディスクがもったいない気がします。 ● eclispe 一つで JAVAとC++の開発は出来ないのでしょうか?

    • ベストアンサー
    • Java
  • 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 という構図に問題があるんでしょうか ささいなことでも構いません ご教授宜しくお願い致します。

  • Java visualVM 何を監視すれば・・・

    こんにちわ visualVMについて質問がございます。 わかる方いらっしゃれば、ぜひご教授お願い致します。 現在、JavaのJNIを使用し、C++のプログラム(他社製dll)を呼び出すシステムを開発しております。 その中で、プログラムを実行し、VMが落ちることもなく順調に走らせ、 問題なく終了すると、プログラムと同じフォルダに hs_err_pid5368.logというものが生成されます。 終了するたび1つずつ増えていきます。 調べたところ、JavaのVMが異常終了したときにVMから生成されるものでした。 さらに調べたところ、メモリ管理の問題や、コーディングの問題、クラスデータ共有の問題であることだとインターネットにありました。 ですので、これらの問題を解決しようと、 プログラムを見直して書き換えたり ヒープを増やして実行したり dllに問題がないか問い合わせたり クラスデータ共有を無効にして実行したりしても、改善されません。 そこで、visualVMでVMを監視することにしましたが CPUのどこを見ればいいのか メモリの何がいけないのか スレッドの・・・ヒープの・・・(以下略) 何がどうなったらVMに悪影響が出るのか わかりかねております。 わかる方いらっしゃれば、どうかご教授宜しくお願い致します。

  • JAVAコンパイルと実行

    はじめまして。質問があります。 eclipseで開発したjavaのソースを実行するとき、メニューからメインクラスを指定し実行するだけでプログラム実行されますが、そのプログラムをコマンドプロンプトで実行する場合、できるプログラムとできないプログラム(例外:NoClassDefFoundError)があります。 コンパイルはeclipceのほうで勝手に.classファイルが生成されるので、そのclassファイルをjava [ファイル名]と打つだけだと思います。 実行できるプログラムとできないプログラムの違いは以下の通りです。 ・実行できるプログラム eclipseで新規でプロジェクトを作成。その直下にソースが存在し、クラスファイルも同じディレクトリに生成されます。 ・実行できないプログラム eclipseで新規でプロジェクトを作成。ソースフォルダ(src)を作成し、その下からパッケージ、クラスを作成しました。そうすると、エクスプローラでそのプロジェクトを見ると、binフォルダが生成されていました。その中にクラスファイルが生成されます。 違いはこのような感じです。実行できないプログラムをコマンドプロンプトで実行させるためにはどうしたらよいでしょうか?eclipseの使い方はだいぶわかってきたのですが、どのように動作しているか(java自体も)がわかりません。ご教授宜しくお願い致します。 OS:windows2000 開発環境:eclipse 3.0(J2SE 1.4.2_03)

    • ベストアンサー
    • Java

専門家に質問してみよう