• 締切済み

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");//自作のは読込めない } } 困っています。どなたか解決法のわかる方いらっしゃいますか。

  • Java
  • 回答数1
  • ありがとう数2

みんなの回答

  • syousuke
  • ベストアンサー率61% (13/21)
回答No.1

TestDll.DLLが存在するディレクトリへのPATH設定は行っていますか または、\windows下にTestDll.DLLファイルを置いていますか?

madman
質問者

補足

PATHや環境などは問題ありません。 ので、困っています。

関連するQ&A

  • JNI 戻り値の渡し方について

    javaからCのdllを呼出すJNIを作っています。 やりたい事は ・C側で実行した結果がchar[256]に設定され、戻り値としてjava側に渡される。 ・java側でその中身を編集する ですが、java側で例外が発生します。 jcharArrayと言う型に入れさえすれば良いと思ってたのですが・・・ char[]をjava側で見る&編集する方法をどなたかご教授ください・・・。 よろしくお願いします。 ----------jnitest.dll---------- #include "stdafx.h" #include "../../JNI_test.h" #include <Windows.h> #include <stdio.h> #ifdef _MANAGED #pragma managed(push, off) #endif BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { return TRUE; } #ifdef _MANAGED #pragma managed(pop) #endif JNIEXPORT jcharArray JNICALL Java_JNI_1test_getScreenData(JNIEnv *env, jobject obj){ LONG ret; LONG id; char buff[256]; LPVOID lpvoid; DWORD len = 0; memset(buff,0x00,sizeof(buff)); lpvoid = buff; len = sizeof(buff); ~ここでbuffに値を設定する~ jcharArray result = (jcharArray)buff; return result; } ----------JNI_test.java---------- public class JNI_test { public native char[] getScreenData(); static{ System.loadLibrary("jnitest"); } public static void main(String[] args) { JNI_test jniObj = new JNI_test(); char[] kekka = jniObj.getScreenData(); System.out.println("出力内容:"+kekka);←ここで例外発生。 } }

  • 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です。 上記の仕様に問題があるのでしょうか。 それでは私のコンピュータで接続できている理由がわからなくなりますが ・・・もう、なにもわかりません どうか、ご教授宜しくお願い致します。

  • JNIについて

    JNIを使ったJavaコードの実行ができず困っています. 【Javaのコード】 public class HelloWorldJNI { static { System.loadLibrary("HelloWorldJNI"); } public native void sayHelloWorld(); public static void main(String[] args) { HelloWorldJNI hello = new HelloWorldJNI(); System.out.println("テスト"); hello.sayHelloWorld(); } } 【Cのコード】 #include "HelloWorldJNI.h" int main(int argc, char * argv[]) { return 0; } JNIEXPORT void JNICALL Java_HelloWorldJNI_sayHelloWorld (JNIEnv *env, jobject obj ) { printf("Hello JNI World\n"); return; } 【Cのコンパイラ】 Microsoft Platform SDK for Windows Server 2003で, WindowsXP x64 Buid Environmentを使って,↓のようなバッチファイルを 実行しています. (OSは,WindowsXPのx64edition SP2です.) コンパイル・リンク中にエラーは出ません. 【ビルド】 echo off set JNI="C:\Program Files\Java\jdk1.6.0_07\include" set JNI1=%JNI%\win32 set OUTPUTDIR=. cl /nologo /c /I%JNI% /I%JNI1% /I. /LD /Zi /Od HelloWorldJNI.c LINK /nologo /NODEFAULTLIB /OPT:NOREF /out:HelloWorldJNI.dll HelloWorldJNI.obj bufferoverflowu.lib oldnames.lib kernel32.lib user32.lib netapi32.lib advapi32.lib gdi32.lib comdlg32.lib comctl32.lib wsock32.lib libcmtd.lib 【実行結果】 ↓こんなエラーになります. C:\WORK\>"C:\Program Files\Java\jre1.6.0_07\bin\java.ex e" HelloWorldJNI テスト # # An unexpected error has been detected by Java Runtime Environment: # # EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x000000000001c0e8, pid=3864, t id=2528 # # Java VM: Java HotSpot(TM) 64-Bit Server VM (10.0-b23 mixed mode windows-amd64) # Problematic frame: # C 0x000000000001c0e8 # # An error report file with more information is saved as: # C:\work\hs_err_pid3864.log # # If you would like to submit a bug report, please visit: # http://java.sun.com/webapps/bugreport/crash.jsp # The crash happened outside the Java Virtual Machine in native code. # See problematic frame for where to report the bug. # 【質問】 原因となっていることや確認すべきことをご指摘頂ける方, いらっしゃいませんでしょうか.

    • ベストアンサー
    • Java
  • JNIでロードするライブラリが見つからない

    JNIを使ってライブラリを呼び出すとき, Exception in thread "main" java.lang.UnsatisfiedLinkError: no HelloWorldJNIlib in java.library.path というようにライブラリが見つからないエラーが出て困っています. 【Javaのコード】 [*****@**** jnitest]$ vi HelloWorldJNI.java public class HelloWorldJNI { static { System.loadLibrary("HelloWorldJNIlib"); } public native void sayHelloWorld(); public static void main(String[] args) { HelloWorldJNI hello = new HelloWorldJNI(); hello.sayHelloWorld(); } } 【Cのコード】 [*****@**** jnitest]$ vi HelloWorldJNI.c #include "HelloWorldJNI.h" JNIEXPORT void JNICALL Java_HelloWorldJNI_sayHelloWorld (JNIEnv *env, jobject obj ) { printf("Hello World"); } 【手順】 [*****@**** jnitest]$ javac HelloWorldJNI.java [*****@**** jnitest]$ ls HelloWorldJNI.c HelloWorldJNI.class HelloWorldJNI.java [*****@**** jnitest]$ javah HelloWorldJNI [*****@**** jnitest]$ ls HelloWorldJNI.c HelloWorldJNI.class HelloWorldJNI.h HelloWorldJNI.java [*****@**** jnitest]$ gcc -fPIC -shared -I/usr/lib/jvm/java-1.6.0/include/ -I/usr/ lib/jvm/java-1.6.0/include/linux/ HelloWorldJNI.c -o HelloWorldJNIlib.so [*****@**** jnitest]$ ls HelloWorldJNI.c HelloWorldJNI.h HelloWorldJNIlib.so HelloWorldJNI.class HelloWorldJNI.java [*****@**** jnitest]$ export LD_LIBRARY_PATH=. [*****@**** jnitest]$ java HelloWorldJNI Exception in thread "main" java.lang.UnsatisfiedLinkError: no HelloWorldJNIlib in java.library.path at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1698) at java.lang.Runtime.loadLibrary0(Runtime.java:840) at java.lang.System.loadLibrary(System.java:1047) at HelloWorldJNI.<clinit>(HelloWorldJNI.java:3) [*****@**** jnitest]$ java -Djava.library.path=. HelloWorldJNI Exception in thread "main" java.lang.UnsatisfiedLinkError: no HelloWorldJNIlib in java.library.path at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1698) at java.lang.Runtime.loadLibrary0(Runtime.java:840) at java.lang.System.loadLibrary(System.java:1047) at HelloWorldJNI.<clinit>(HelloWorldJNI.java:3) [*****@**** jnitest]$ 何を見直すべきかおわかりの方いらっしゃいませんでしょうか.

    • ベストアンサー
    • Java
  • 例外(throws)について

    例外のthrowsがよくわかりません。 (例1) public static void main(String[] args) throws Exception { new testClass().testA(); } void testA() throws Exception { FileReader exFile = new FileReader("exFile.txt"); } (例2) public static void main(String[] args) throws FileNotFoundException { new testClass().testA(); } void testA() throws FileNotFoundException { FileReader exFile = new FileReader("exFile.txt"); } 上記2つの例ではどちらも 「java.io.FileNotFoundException: exFile.txt (指定されたファイルが見つかりません。)」 というログが出力されるようです。 throws ExceptionにしてもFileNotFoundExceptionと判別できるのならば、 あえてthrows FileNotFoundExceptionにする必要がなく、大抵の場合 throws Exceptionにしておけばよいと思うのですが、 その解釈は間違っているでしょうか?

    • ベストアンサー
    • Java
  • JavaのDateクラスについて教えてください.

    下のプログラムを実行すると, Date : Mon Jan 30 15:30:00 JST 2006 となります. 私としては,Apr となることを期待するのですが, おかしいでしょうか? Javaの環境は,jdk1.5.0_05 です. // ここから import java.text.SimpleDateFormat; import java.util.Date; public class DateTest { public static void main(String[] args) throws Exception { String dateStr = "2006/04/30 15:30"; Date date = new SimpleDateFormat("yyyy/MM/DD HH:mm").parse(dateStr); System.err.println("Date : " + date); } }

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

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

  • throw文について

    上と下のソースプログラムがよく似ているのにもかかわらず上記のプログラムでコンパイルエラー発生する理由がわかりません。 解決方法はpublic static void badMethod()throws IOException{に書き換えるということが分かっていますがイマイチ理屈が分からない次第であります。 たぶん、上記のプログラムはimport文があるからだと思うのですが回答のほどよろしくお願い致します。 (コンパイルエラー) import java.io.IOException; class TryCatch{ public static void main(String args[]){ try{ badMethod(); System.out.println("A"); } catch(IOException ex){ System.out.println("B"); } catch(Exception e){ System.out.println("C"); } System.out.println("E"); } public static void badMethod(){ throw new IOException(); } } (コンパイル正常) public class X{ public static void main(String args[]){ try{ badMethod(); System.out.println("A"); } catch(Exception ex){ System.out.println("B"); } finally{ System.out.println("C"); } System.out.println("D"); } public static void badMethod(){ throw new RuntimeException(); } }

  • C#で実行可能なdllの作成方法

    現在、C#でアプリケーションを作成していますが、exe形式ではなくdll形式で実行可能な モジュールを作成したいです。 しかし、単に[STAThread]のMain関数を作ったり、staticコンストラクタを作成しただけでは 起動できません。 どうしたら実行可能なdllを作成できるのでしょうか。 最終的にやりたいことは、C++のCreateRemoteThread()からこのdllを起動することです。 どうぞよろしくお願いします。

  • 実行時引数をrun()メソッドに渡すには?

    初めまして。宜しくお願いします。 Javaの初心者で現在勉強中で、一定時間ごとに命令を走らせるプログラムを作ろうとしており、様々なサイトや本を参考にした結果、Timerクラス、TimerTaskクラスを使うと良さそうという事がわかりました。 一定周期毎に標準出力するのみのプログラムなら出来たのですが、実行時引数を一定周期毎に標準出力するプログラム作成時に躓いてしまいました。 望む挙動: $ java test1 abcdef とターミナルに入力して、一定周期毎に、"abcdef"が表示し続ける挙動。 躓いている点: main()メソッドからrun()メソッドに実行時引数(この場合、String st = String new args[0];)を渡そうと試みてる点。 -----------------ソースコード--------------------- import java.util.Timer; import java.util.TimerTask; public class test1 { public static void main(String args[]) throws Exception{ String st = new String(args[0]); Timer timer = new Timer(); timer.schedule(new TestTimer(), 0, 1000); } /** * 指定間隔置きに呼ばれる処理 */ static class TestTimer extends TimerTask{ public void run(){ System.out.println(st); // System.out.println("Hello, World!"); } } } ---------------------------------------------- 宜しくお願いします。

    • ベストアンサー
    • Java