- PR -

JNI関数呼び出し時に発生するエラーについて質問です

1
投稿者投稿内容
さいばぁ
会議室デビュー日: 2006/04/11
投稿数: 13
投稿日時: 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)
ranco
大ベテラン
会議室デビュー日: 2007/11/02
投稿数: 112
投稿日時: 2008-06-21 20:02
HP-UX JNI_CreateJavaVM SIGSEGVでGoogleしてみたら、なにかがnull pointer臭いですね。
99ri
大ベテラン
会議室デビュー日: 2006/09/09
投稿数: 129
投稿日時: 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の使用
99ri
大ベテラン
会議室デビュー日: 2006/09/09
投稿数: 129
投稿日時: 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で検索
アプリケーションを正しく初期化できませんでした
さいばぁ
会議室デビュー日: 2006/04/11
投稿数: 13
投稿日時: 2008-07-01 14:00
ranco様、99ri様
ご返事ありがとうございました。
リンク先のHP等を参考にし、何とか動くものができました。
コンパイル時のオプションに -lpthread をリンクすればよかったみたいです。

ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)