• 締切済み

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

みんなの回答

  • wormhole
  • ベストアンサー率28% (1619/5653)
回答No.2

>アプリケーション動作に必要になる設定などは、アプリケーションパッケージ内に配置されており、 >NSApplicationMainでそれを読み込んで動作するようなんですが。。。 ということはNSApplicationMainは第1引数, 第2引数以外の何らかの手段でアプリケーションパッケージの場所を特定しているという事ですよね。 それがどのような手段なのか調べてみるのがいいのかもしれませんね。 役に立つかどうかわからない回答ですいません。

imamu8415
質問者

お礼

引き続きご回答ありがとうございます。 wormholeさんがおっしゃるように引数とは別の手段で描画、他クラスの呼び出しに必要な設定を得ているようです。 その手段というのがどのようなのか、引き続き調べてみます。 お答えいただいて嬉しいです。 ありがとうございます。

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

Objective-CというよりはCocoaの話だと思うんですが、JNIの話はひとまず置いといて int main(int argc, char **argv) { int ac = 0; const char *av[0]; return NSApplicationMain(ac, av); } で、動作するアプリケーションは作れるんでしょうか? 私はObjective-CもCocoaも知らないのですが、av[0]にある文字列を元に動作するのに必要な設定ファイル名を求めてたりしてそうな気がするんですけど。

imamu8415
質問者

お礼

NSApplicationMain(ac, av); この関数を使用すると中で、画面描画などの処理が行われるようですが、 それに必要な設定や値は結局引数や設定ファイルの配置ではどうにもなりませんでした。 Java側でawtを使用して、そのスレッドにNSWindowをのせWebViewで読み込みとすればブラウザは機能することがわかりました。 まだ完全にシステムは完成していませんが、一旦ココで締切としようと思います。 ご協力ありがとうございました。

imamu8415
質問者

補足

回答ありがとうございます。 質問いただいている形で動作するアプリケーションはつくれます。動作確認済みです。 av[0]は、起動引数なだけで、他に設定などを指定していることはありませんでした。 アプリケーション動作に必要になる設定などは、アプリケーションパッケージ内に配置されており、 NSApplicationMainでそれを読み込んで動作するようなんですが。。。 JNIとして作成したダイナミックライブラリ(Macなのでjnilib)にはNSApplicationMainで必要とする設定ファイルをもっていないので 動作するアプリケーションに配置されている設定ファイルなどを様々な場所に配置してみるのですが 配置位置が悪いのか、読み込まれないのか、同じエラーで動作しませんでした。

関連する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++ ログファイル生成される

    お世話になっております。 以前も何度か似たような質問をさせて頂いたのですが 未だ解決に至りませんので、再度質問させていただきます。 現在、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 という構図に問題があるんでしょうか ささいなことでも構いません ご教授宜しくお願い致します。

  • 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
  • 「外部シンボル '__inp' が未解決」

    Borland C++CompilerとCPad for Borland C++Compilerをつかってdllを作ろうとしているのですが、 コンパイルがうまく行きません。 ------------------------------<Dio32c.c>------------------------------ #include "jni.h" #include <stdio.h> #include <conio.h> JNIEXPORT long JNICALL Java_IO32_InpB(JNIEnv *env, jobject obj, long port) { return _inp(port); } JNIEXPORT void JNICALL Java_IO32_OutB(JNIEnv *env, jobject obj, long port, long data) {_outp(port, data); return; } ---------------------------------------------------------------------- というプログラムに対し、コンパイル時パラメータを「-WD」と指定してコンパイルすると、以下のメッセージが返ってきちゃいます。 ---------------------------------------------------------------------- ■C:\My Documents\C> bcc32 -WD Dio32jc.c Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland Dio32jc.c: ==<警告文は字数制限のため割愛させていただきました。by taropoo>== Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland Error: 外部シンボル '__inp' が未解決(C:\MY DOCUMENTS\C\DIO32JC.OBJ が参照) Error: 外部シンボル '__outp' が未解決(C:\MY DOCUMENTS\C\DIO32JC.OBJ が参照) ---------------------------------------------------------------------- どなたか、原因&対策、分かりませんでしょうか?

  • CのDLLをVC++でコンパイルしたいのですが、エラーになってしまいます。

    c言語の初心者なのですが、質問させて下さい。 javaからCのDLLを呼び出したく、 (下記のソースを書いたのですが、VC++でコンパイルすると LIBCD.lib(crt0.obj) : error LNK2001: 外部シンボル "_main" は未解決です Debug/HelloWorld.exe : fatal error LNK1120: 外部参照 1 が未解決です。 と出てしまいます。 過去ログ等を見て、作成しているプロジェクトが悪いのかなと思い、 MFC appWizark(dll) win32 Application win32 Console Application win32 Dynamic-Link Library 等を作ってみてコンパイルしてみたのですが、駄目でした。 ちなみにDOSプロンプトで cl -IC:\j2sdk1.4.2_10\include\win32 -LD HelloWorl d.c -o HelloWorld.dll と実行するときちんとコンパイルできて、正常に実行も出来ました。 VC++でどうやればコンパイルできるのでしょうか? #include "HelloWorld.h" JNIEXPORT void JNICALL Java_HelloWorld_printMessage (JNIEnv *env, jobject me) { printf("Helo World!!!\n"); return; }

  • 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を使用して、JAVAのメソッド実行結果の取得

    JNIを使用して、VC6からJAVA(アプリケーション)のメソッドを起動して結果を構造体(複数件数)で受け取る事は可能ですか。 JAVAからデータの取得を方法について教えて下さい。

    • ベストアンサー
    • Java
  • コンパイルするとエラーに。C言語

    OSはLINUXです。GNOME 端末を使用してます。ここの関数でエラーが起きているみたいなんです。(部分的に載せてしまいましたが、それとも全体も載せた方がいいでしょうか?) void readargs(int argc, char *argv[]) { int c; int atoi(char *); while (--argc > 0 && (c = (*++argv)[0] == '-' || c == '+') { if (c == '-' && !isdigit(*(argv[0]+1))) while (c = *++argv[0]) switch (c) { case 'd': option |= DIR; break; case 'f': option |= FOLD; break; case 'n': option |= NUMERIC; break; case 'r': option |= DECR; break; default: printf("sort: illegal option %c\n", c); error("Usage: sort -dfnr [+pos1] [-pos2]"); break; } else if (c == '-') pos2 = atoi(argv[0]+1); else if ((pos1 = atoi(argv[0]+1)) < 0) error("Usage: sort -dfnr [+pos1] [-pos2]"); } if (argc || pos1 > pos2) error("Usage: sort -dfnr [+pos1] [-pos2]"); } } ちなみに、エラー内容は「case label not within a switch statement」 「break statement not within loop or switch」です。 似たような問題はできたのですが、これだけはなぜかエラーが起きてしまいました。アドバイス・回答待ってます。

  • Apache2+JK2でjniを使用するとサーバーエラー(500)

    Tomcat4.1.24+Apache2+JK2を使ってPort 80でも JSP/Servletにアクセス出来るようにはなったのです が、JNIを使った通信がなかなかうまくいきません。例 えば、http://localhost/roller/にアクセスすると、 500 Internal Server Errorが返ってきます。どのよう にしたら解決できるのでしょうか?お願いします。 #workers2.properties [channel.jni:jni] [config:] TOMCAT_HOME=C:/Program Files/Apache Group/Tomcat 4.1 # Java バーチャルマシンのパラメータの定義 [vm:] info=Parameters used to load a JVM in the server process OPT=-Djava.class.path=${TOMCAT_HOME}/lib/tomcat-jni.jar;${TOMCAT_HOME}/lib/tomcat.jar OPT=-Dtomcat.home=${TOMCAT_HOME} OPT=-Dcatalina.home=${TOMCAT_HOME} OPT=-Xmx128M # JNI ワーカの起動時ハンドラ [worker.jni:onStartup] info=Command to be executed by the VM on startup. This one will start tomcat. class=org/apache/jk/apr/TomcatStarter ARG=start stdout=${serverRoot}/logs/stdout.log stderr=${serverRoot}/logs/stderr.log # JNI ワーカの終了時ハンドラ [worker.jni:onShutdown] info=Command to be executed by the VM on shutdown. This one will stop tomcat. class=org/apache/jk/apr/TomcatStarter ARG=stop # Tomcat の examples Web アプリケーションを Web サーバ URI 空間にマップ(関連付け) [uri:/examples/*] [uri:/roller/*] ====Apacheのerror.log========== [[Tue Jul 22 16:02:32 2003] [error] mod_jk.handler() Error connecting to tomcat 120000

専門家に質問してみよう