• ベストアンサー

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
  • 回答数2
  • ありがとう数4

質問者が選んだベストアンサー

  • ベストアンサー
noname#208124
noname#208124
回答No.2

#1で正解っぽいですけど、DLLに本来不要なmain関数がある所為でエラーが出るべきところで隠れてますね 無ければLINK時にDLLじゃなくDLL拡張子の実行ファイル作ろうとするのでmainが無いエラー出ます あるいはLINKを分けない、余計な引数指定をしない LINKを分けなければ問題なく/DLLが渡されますし、LINKに/OUT指定してなかったらHelloWorldJNI.exeが作られるので原因に気付いたんじゃないかなと

higedansya
質問者

お礼

元々,clとLINKを分けずにやっていてうまく行かなかったので, その原因特定のために分けたんですが, 分けた際には/DLLを入れなければならないことを知りませんでした. 「/OUT指定していなかったら,,,」という点も含め勉強になりました. ありがとうございました.

その他の回答 (1)

  • dakusui
  • ベストアンサー率50% (1/2)
回答No.1

HelloWorldJNI.c にmain関数があるところから察すると、このファイルを共有ライブラリ(.dll)としてではなく、実行ファイル(.exe)としてコンパイル→ビルドしているのではないでしょうか? 上記の推測が正しいと仮定すると、 http://msdn.microsoft.com/ja-jp/library/527z7zfs.aspx こちらをご覧になっては。 ウインドウズには明るくないのですが、リンカのオプションに /DLL とかつけなくてはいけないのではないのでしょうか。

higedansya
質問者

お礼

ありがとうございました. リンカのオプションに/DLLでうまくいきました. 初歩的でお恥ずかしい限りです. 解決しましたが,ご参考として. ・教えて頂いたリンク先ですが, 「Sorry, we were unable to service your request. 」 で表示できませんでした. ・main関数があるのは,main関数がないと, LINKで, LINK : fatal error LNK1561: entry point must be defined というエラーを出してしまったからでした. ただ,/DLLをつければmainがなくてもこのエラーは出ませんでした.

関連するQ&A

  • 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
  • マインクラフトがプレイできない

    マインクラフトをはじめようとしたら以下のようなエラーが出ました。私にはさっぱりわからないので詳しい方教えていただけないでしょうか。 # # A fatal error has been detected by the Java Runtime Environment: # # EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x29cf3e88, pid=3756, tid=4400 # # JRE version: Java(TM) SE Runtime Environment (8.0_45-b15) (build 1.8.0_45-b15) # Java VM: Java HotSpot(TM) Client VM (25.45-b02 mixed mode windows-x86 ) # Problematic frame: # C [ig4dev32.dll+0x3e88] # # 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:\Users\user\AppData\Roaming\.minecraft\hs_err_pid3756.log # # If you would like to submit a bug report, please visit: # http://bugreport.java.com/bugreport/crash.jsp # The crash happened outside the Java Virtual Machine in native code. # See problematic frame for where to report the bug. # AL lib: (EE) alc_cleanup: 1 device not closed Java HotSpot(TM) Client VM warning: Using incremental CMS is deprecated and will likely be removed in a future release

  • Java JNI使用後にログファイルが生成される

    こんにちわ JavaからC++のプログラムを呼び出し、ハードウェアを動かすプログラムを開発しているんですが Javaでプログラムを起動し、C++を呼び出して終了すると Javaプログラムと同一ディレクトリ内にlogファイルが生成され、困っております。 インターネットで調べたところ、JavaVMのエラーまたはレジストリのエラー ということがぼんやりわかった程度で、解決策が見つけ出せずにおります。 インターネットでインストールをしなおすと直るとあったので Javaのインストールをやり直してみたり、logファイルを和訳してみたりしましたが 状況が変わらないためご相談させて頂きます。 どなたかおわかりになる方、少しの情報でもかまいませんので ご回答宜しくお願い致します。 eclipseコンソール上のエラー文です。logファイルについては文字数制限のためオーバしてしまいました。 内容↓ # # A fatal error has been detected by the Java Runtime Environment: # # EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x06722cd2, pid=5572, tid=4244 # # JRE version: 7.0_05-b05 # Java VM: Java HotSpot(TM) Client VM (23.1-b03 mixed mode, sharing 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_pid5572.log # # If you would like to submit a bug report, please visit: # http://bugreport.sun.com/bugreport/crash.jsp #

    • ベストアンサー
    • Java
  • マインクラフトができません

    マインクラフトのエラーについての質問です 以下の様なエラーが出て遊べません。 対処を教えていただけませんでしょうか? # # A fatal error has been detected by the Java Runtime Environment: # # EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x000007feed1aa10f, pid=4128, tid=2236 # # JRE version: Java(TM) SE Runtime Environment (8.0_25-b18) (build 1.8.0_25-b18) # Java VM: Java HotSpot(TM) 64-Bit Server VM (25.25-b02 mixed mode windows-amd64 compressed oops) # Problematic frame: # C [ig7icd64.dll+0x3a10f] # # 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:\Users\teru\AppData\Roaming\.minecraft\hs_err_pid4128.log # # If you would like to submit a bug report, please visit: # http://bugreport.sun.com/bugreport/crash.jsp # The crash happened outside the Java Virtual Machine in native code. # See problematic frame for where to report the bug. # [error occurred during error reporting , id 0xc0000005] ちなみに、javaは最新です

  • 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);←ここで例外発生。 } }

  • exewrapで変換したexeファイルが開けない

    eclipse作ったjarファイルをexewrapでexeファイルに変換したのですけど、変換したexeファイルをダブルクリックしても実行されず、エラーログファイルが出力されます。 ↓エラーログ(どこが重要なのかよくわからないので一部ですが・・・ ------------------------------------------------------------------------------ # # A fatal error has been detected by the Java Runtime Environment: # # Internal Error (0xc06d007e), pid=4896, tid=4940 # # JRE version: Java(TM) SE Runtime Environment (8.0_20-b26) (build 1.8.0_20-b26) # Java VM: Java HotSpot(TM) 64-Bit Server VM (25.20-b23 mixed mode windows-amd64 compressed oops) # Problematic frame: # C [KERNELBASE.dll+0x940d] # # Failed to write core dump. Minidumps are not enabled by default on client versions of Windows # # If you would like to submit a bug report, please visit: # http://bugreport.sun.com/bugreport/crash.jsp # The crash happened outside the Java Virtual Machine in native code. # See problematic frame for where to report the bug. # ------------------------------------------------------------------------------ 詳しい方いらっしゃいましたら、ご助力お願いします。

  • JavaとObjective-c間でJNIエラー

    JavaとObjective-c間でJNIを使用してGUIのアプリケーション連携を行いたいのですが エラーになってしまいます。 アプリケーションの起動をNSApplicationMain関数を使用してしようとしてるのですが、 JNIの関数では使用できないのでしょうか? 一部抜粋ですが、以下のように呼び出しています。 また、このように連携を行いたい場合、どのようにするべきでしょうか? ご教授ください。 JNIEXPORT void JNICALL Java_JniApp_start (JNIEnv *env, jobject this) { int argc = 0; char *argv[0]; NSApplicationMain(argc, (const char**)argv); } こちらをJava側で呼び出すとエラーとなります。 エラー内容は以下になります。 java[1646:1303] No Info.plist file in application bundle or no NSPrincipalClass in the Info.plist file, exiting

  • javaエラー

    javaを開くと、メモ帳でエラーに関することがデスクトップに作成されます、内容は # A fatal error has been detected by the Java Runtime Environment: # EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x0327a00a, pid=908, tid=3968 # JRE version: 6.0_26-b03 # Java VM: Java HotSpot(TM) Client VM (20.1-b02 mixed mode, sharing windows-x86 ) # Problematic frame: # C 0x0327a00a # # 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. --------------- T H R E A D --------------- Current thread (0x030b3400): JavaThread "AWT-Windows" daemon [_thread_in_native, id=3968, stack(0x03480000,0x034d0000)] siginfo: ExceptionCode=0xc0000005, writing address 0x00000001 Registers: EAX=0x0318c188, EBX=0x00000001, ECX=0x0313f588, EDX=0x6d103af8 ESP=0x034cfa00, EBP=0x034cfa2c, ESI=0x030b3528, EDI=0x00000001 EIP=0x0327a00a, EFLAGS=0x00010202 Top of Stack: (sp=0x034cfa00) 0x034cfa00: 6d09cb4f 034cfa94 6d09c650 00000000 0x034cfa10: 00000000 00000001 030b3528 034cfa04 0x034cfa20: 034cfab0 6d0c04a8 00000001 034cfa58 0x034cfa30: 77cf8734 0012019c 00009819 0313f528 0x034cfa40: 00000001 6d09c650 dcbaabcd 00000000 0x034cfa50: 034cfa94 6d09c650 034cfac0 77cf8816 0x034cfa60: 6d09c650 0012019c 00009819 0313f528 0x034cfa70: 00000001 034cfb54 034cfb4c 00643458 どの様にすればよいのか解りません どなたか教えて下さい。

  • JNI C言語からjava

    お世話になります。 JNIでC言語からJAVAを呼び出したいのですがやり方が分からないので教えて下さい。 【呼び出されるJAVA側のソース】 public class JniTest { public String GetXX(String P1, String P2) { String R = P1 + P2; return R; } } 上記をC言語から呼び出して結果を表示したいのですが、どのようにコーディングしたら良いのか分かりません。 色々探してみたのですがギブアップです。 よろしくお願いします。

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