2012-03-10 21 views
0

ネイティブDLLライブラリを呼び出すJavaアプリケーションを開発しています。私は呼んでC++メソッドのための私のコード:JNIネイティブdllが返されないjobjectArrayがクラッシュするVM

JNIEXPORT jobjectArray JNICALL Java_Surf_TopSurfWrapp_computeSurfExtractDescriptor__LSurf_TopSurfVisualword_2Ljava_lang_String_2(JNIEnv *env, jclass c, jobject vw, jstring imagePath) 
{ 
c = env->GetObjectClass(vw); 
printf("start\n"); 
jobjectArray ret = (jobjectArray) env->NewObjectArray(100, c, vw); 

for (int i = 0; i < 100; i++) 
{ 
    jmethodID visualWordConstructor = env->GetMethodID(c, "<init>", "(IFFIFFFF)V"); 
    jobject element = env->NewObject(c, visualWordConstructor, 1, 1.0, 1.0, 1, 1.0, 1.0, 1.0, 1.0); 
    env->SetObjectArrayElement(ret, i, element); 
} 
    printf("end\n"); 
return ret; 
} 

私はいくつかの計算を省略しましたが、問題はJNIはjobjectArrayを返しているときのようです。 私のJavaコード:

public class Wrapp { 
    native public static TopSurfVisualword[] computeSurfExtractDescriptor(TopSurfVisualword initVW, String imagePath); 
    static { 
     System.loadLibrary("TopSurfWrapp"); 
    } 

    public static void main(String[] args) { 
    TopSurfVisualword[] d = TopSurfWrapp.computeSurfExtractDescriptor(new TopSurfVisualword(), "d:\\oil.jpg"); 
    } 
} 

私は、次のJVMエラーを取得しています:

debug: 
# 
# A fatal error has been detected by the Java Runtime Environment: 
# 
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x0000000076d73332, pid=3384, tid=1572 
# 
# JRE version: 7.0-b147 
# Java VM: Java HotSpot(TM) 64-Bit Server VM (21.0-b17 mixed mode windows-amd64 compressed oops) 
# Problematic frame: 
# C [ntdll.dll+0x53332] 
# 
# 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: 
# D:\Programming\Visual Studio projects\GPC\TopSurfWrapp\x64\Release\hs_err_pid3384.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. 
# 
start 
end 
Java Result: 1 

私は問題がであることを仮定している「開始」と「終了」のメッセージを取得していますので配列を返します。 問題のあるフレームは、ntdll.dll(私のダイナミックライブラリではありません)にあるようです。 助けてください。

+1

コードにエラーチェックはありません。ネイティブデバッガを使用してJavaプロセスにアタッチし、dll内で何が起きているかを確認します。あるいは少なくとも、 'env'メソッド呼び出しの戻り値と、デバッグメッセージを出力してください。 – Mersenne

+0

戻り値は問題ありませんでした。ジョブオブジェクトを作成するためにいくつかの値を計算するために使用したリソースを解放する際にいくつかの問題がありました。 – Mihai

答えて

3

サンプルを自分のシステムでテストしたところ、正常に動作しています。ネイティブコードでprintf関数を使用してデバッグの場合は、fflushは各printf関数に従う

1)

デバッグにいくつかのヒント...。

printf("debug message\n"); 
fflush(stdout); 

2)JNI関数からのヌル戻り値を確認します。

jmethodID visualWordConstructor = env->GetMethodID(c, "<init>", "(IFFIFFFF)V"); 
if(visualWordConstructor==0) { 
    // print/fflush an error message or throw an exception or both 
    // stop processing and return to java now 
} 

3)JNI中に標準出力と例外/エラーに印刷するのは難しい場合があります。 次の操作を行って、動作を確認してください。

jclass rx = env->FindClass("java/lang/RuntimeException"); 
printf("start\n"); 
fflush(stdout); 

env->ThrowNew(rx, "thrown from native code"); 

printf("end\n"); 
fflush(stdout); 

最初に「終了」が表示され、例外が表示されます。
JNI中の例外は、Java側が制御権を獲得するまで、 にキューされているため、これは予期されています。

+0

あなたの答えをありがとう、あなたはポイントがある、私はEXCEPTION_ACCESS_VIOLATIONエラーを引き起こしていたがわかった、それは私がjobjectを作成するためのいくつかの値を計算するために使用したいくつかのリソースを解放する問題でした。 – Mihai

関連する問題