ネイティブ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(私のダイナミックライブラリではありません)にあるようです。 助けてください。
コードにエラーチェックはありません。ネイティブデバッガを使用してJavaプロセスにアタッチし、dll内で何が起きているかを確認します。あるいは少なくとも、 'env'メソッド呼び出しの戻り値と、デバッグメッセージを出力してください。 – Mersenne
戻り値は問題ありませんでした。ジョブオブジェクトを作成するためにいくつかの値を計算するために使用したリソースを解放する際にいくつかの問題がありました。 – Mihai