- - PR -
JNI関数呼び出し時に発生するエラーについて質問です
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2008-06-20 20:12
こんばんわ
現在、あるJAVAで作られているパッケージのAPIをJNI関数を使用して C言語から呼出すアプリケーションをテストしています。 しかし、いざ実行しようとすると、「JNI_CreateJavaVM」を呼んだ直後に このアプリケーションが落ちてしまいます。 呼出し後のprintfが実行されていないためそう判断しています。 どなたかこの事象の解決方法を教えていただけないでしょうか。 よろしくお願いいたします。 ○エラーの内容 beginning execution... JNI_GetDefaultJavaVMInitArgs[0] vm_args[65540][0][0] Segmentation fault (core dumped) ○gdbでの内容 Program received signal SIGSEGV, Segmentation fault si_code: 2 - SEGV_ACCERR - Invalid Permissions for object. 0x200000007d4057d0:0 in ENTER_PTHREAD_LIBRARY_FUNC+0x50 () from /usr/lib/hpux32/libpthread.so.1 ○該当のソース #include <stdio.h> #include <time.h> #include <jni.h> #include <stdlib.h> #include <string.h> #include "cg_rc.h" #include "cg_capstrn_java.h" /* グローバル変数 */ jobject ses_send; /* プロトタイプ宣言 */ int ap_init( char* ); int send_start( char*, char*, char*, char* ); int send_report( char*, char* ); void ap_close( void ); int throw_exception( JNIEnv * ); JavaVM* getVM( void ); jbyteArray JNICALL JSTRINGtoJBYTEARRAY (JNIEnv *, jstring ); int JNICALL JBYTEARRAYtoCHAR (JNIEnv *, jbyteArray, char* ); int get_caps_error( char*, char* ); int ap_init( char* DEST_ID ) { JNIEnv *env; JNIEnv jni; JavaVM *jvm; JavaVM vmi; JavaVMInitArgs vm_args; JavaVMOption options[4]; jclass cls = NULL; jclass clsjsend = NULL; jclass clsjsnds = NULL; jmethodID midscns = NULL; jmethodID midsend = NULL; jmethodID midjtout = NULL; jstring strjdid = NULL; jobject mobjsins = NULL; jobject mobjsend = NULL; char cJCPath[1024]; char *cEnvjar = NULL; /* パッケージ jarファイルパス(環境変数) */ int iRet = 0; jint res; vm_args.version = JNI_VERSION_1_4; iRet = JNI_GetDefaultJavaVMInitArgs( &vm_args ); if( iRet != JNI_OK ) { return CAFIS_RC_ERROR_FILE; } printf("JNI_GetDefaultJavaVMInitArgs\n"); cEnvjar = getenv( "CGJARPATH" ); memset( cJCPath, 0x00, sizeof( cJCPath ) ); sprintf( &cJCPath[0], "-Djava.class.path=.;%s", cEnvjar ); options[0].optionString = cJCPath; vm_args.nOptions = 1; vm_args.options = options; vm_args.ignoreUnrecognized = JNI_FALSE; printf("JNI_CreateJavaVM\n"); res = JNI_CreateJavaVM(&jvm, (void **)&env, &vm_args ); if( res != JNI_OK ) { printf("Fail to create vm. [%ld]\n", res); return RC_ERROR_FILE; } printf("JNI_CreateJavaVM OK\n"); jni = *env; vmi = *jvm; ○コンパイル内容 cc -g -c -Ae +u4 -D_HPUX -DNATIVE -D_POSIX_C_SOURCE=199506L -D_REENTRANT -I/opt/java1.5/include -I/opt/java1.5/include/hp-ux cmain.c cc -g -O -Wl,-z -o cmain cmain.o -L/opt/java1.5/jre/lib/IA64N/hotspot -ljvm ○OSバージョン HP-UX hpv3ita B.11.31 U ia64 (ta) ○Javaバージョン java version "1.5.0.03" Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0.03-_13_feb_2006_16_39) Java HotSpot(TM) Server VM (build 1.5.0.03 jinteg:02.13.06-21:25 IA64, mixed mode) |
|
投稿日時: 2008-06-21 20:02
HP-UX JNI_CreateJavaVM SIGSEGVでGoogleしてみたら、なにかがnull pointer臭いですね。
|
|
投稿日時: 2008-06-23 22:27
JNI_CreateJavaVMの第3引数vm_argsですが
JavaVMInitArgs vm_argsを自分で設定しているので JNI_GetDefaultJavaVMInitArgsが不要と思われます 参考 http://java.sun.com/j2se/1.5.0/ja/docs/ja/guide/jni/spec/jniTOC.html 呼び出し API の関数 http://docs.hp.com/ja/5589/p09.html#06 HP-UXでのJavaTM 2 JNIの使用 |
|
投稿日時: 2008-06-29 02:10
1.http://docs.hp.com/ja/5589/p09.html#01
Cネイティブ プログラムからjava メソッドを呼び出すサンプル に環境変数を設定する必要がある旨の記述があります 上記の環境変数SHLIB_PATHは設定されているのでしょうか? 2.CYGWIN環境でソースコードを検証してみました JVMに関する共有ライブラリを設定していない ==>落ちる ■jvm.dllのパス指定あり JNI_GetDefaultJavaVMInitArgs JNI_CreateJavaVM 「JNI_CreateJavaVM」では落ちない cJCPathがNULLの場合を含む(だだしHPのコンパイラではない) ■jvm.dllのパス(下記)指定なし /cygdrive/c/javase/jdk1.5.0_07/jre/bin/client そのまま実行 メッセージ出力なしで終了 デバッカ (gdb) run Starting program: /cygdrive/c/eclipse_workspace/ctest3/Debug/ctest3.exe [New thread 1908.0x7e0] gdb: unknown target exception 0xc0000135 at 0x77fac57c 0xc0000135で検索 アプリケーションを正しく初期化できませんでした |
|
投稿日時: 2008-07-01 14:00
ranco様、99ri様
ご返事ありがとうございました。 リンク先のHP等を参考にし、何とか動くものができました。 コンパイル時のオプションに -lpthread をリンクすればよかったみたいです。 ありがとうございました。 |
1