2012-10-28 4 views
3

C++ 코드에서 상당히 기본적인 JNI 호출을 작성하려고합니다.JVM에서 FindClass가 JVM을 충돌 함

JavaVM *jvm; 
JNIEnv *env; 
JavaVMInitArgs vm_args; 
JavaVMOption options[2]; 

// Get the default initialization arguments and set the class 
// path. 
JNI_GetDefaultJavaVMInitArgs(&vm_args); 
options[0].optionString = "-Djava.class.path=./hbase-1.0-SNAPSHOT.jar" 
options[1].optionString = "-verbose:jni"; 
vm_args.nOptions = 2; 
vm_args.version = JNI_VERSION_1_6; 
vm_args.options = options; 


// Load and initialize a Java VM, return a JNI interface 
// pointer in env. 
long result = JNI_CreateJavaVM(&jvm, (void **)&env, &vm_args); 
if (result == JNI_ERR) { 
    LOG(ERROR) << "Failed to create a JVM"; 
    return false; 
} 

jclass cls = env->FindClass("com/scaligent/falcon/hbase/HFileJniReader"); 

내 코드가 FindClass에서 충돌합니다. 이상한 것은 클래스에 정적 블록이 있고 정적 블록에 메시지를 인쇄한다는 것입니다. 나는 몇 줄의 오류를 게시하고있다. 디버깅 또는 소위하는 방법을 알아낼 수 없습니다.

[Dynamic-linking native method java.lang.Package.getSystemPackage0 ... JNI] 
[Dynamic-linking native method java.util.jar.JarFile.getMetaInfEntryNames ... JNI] 
[Dynamic-linking native method java.lang.ClassLoader.defineClass1 ... JNI] 
[Dynamic-linking native method java.io.FileOutputStream.writeBytes ... JNI] 
Starting static block 
[Dynamic-linking native method java.util.zip.Inflater.getBytesWritten ... JNI] 
[Dynamic-linking native method sun.reflect.NativeMethodAccessorImpl.invoke0 ... JNI] 
[Dynamic-linking native method java.security.AccessController.doPrivileged ... JNI] 
[Dynamic-linking native method java.lang.Class.isAssignableFrom ... JNI] 
[Dynamic-linking native method java.lang.System.identityHashCode ... JNI] 
[Dynamic-linking native method java.util.zip.Inflater.end ... JNI] 
[Dynamic-linking native method java.util.zip.ZipFile.close ... JNI] 
[Dynamic-linking native method java.util.TimeZone.getSystemTimeZoneID ... JNI] 
[Dynamic-linking native method sun.nio.fs.UnixNativeDispatcher.init ... JNI] 
[Dynamic-linking native method sun.nio.fs.UnixNativeDispatcher.getcwd ... JNI] 
[Dynamic-linking native method sun.nio.fs.UnixNativeDispatcher.realpath0 ... JNI] 
[Dynamic-linking native method java.io.UnixFileSystem.getLength ... JNI] 
[Dynamic-linking native method java.util.ResourceBundle.getClassContext ... JNI] 
[Dynamic-linking native method sun.reflect.ConstantPool.getUTF8At0 ... JNI] 
[Dynamic-linking native method java.lang.reflect.Proxy.defineClass0 ... JNI] 
[Dynamic-linking native method java.lang.Class.isInstance ... JNI] 
12/10/28 02:08:54 WARN conf.Configuration: fs.default.name is deprecated. Instead, use fs.defaultFS 
ending static block 
# 
# A fatal error has been detected by the Java Runtime Environment: 
# 
# SIGSEGV (0xb) at pc=0x000000000042f9e3, pid=7057, tid=140108980991808 
# 
# JRE version: 7.0_04-b20 
# Java VM: Java HotSpot(TM) 64-Bit Server VM (23.0-b21 mixed mode linux-amd64 compressed oops) 
# Problematic frame: 
# C [hfile_jni_reader_test+0x2f9e3] [email protected]@GLIBC_2.2.5+0x2f9e3 
# 
# Core dump written. Default location: /home/amit/git2/scaligent/falcon/hbase/core or core.7057 
# 
# An error report file with more information is saved as: 
# /home/amit/git2/scaligent/falcon/hbase/hs_err_pid7057.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. 
# 
+0

그래서 어떤 해결책을 찾았습니까? – peeyush

+0

jni throws 일반적으로 신호를 잡아낼 수 있지만 gdb에서는 gdb가 충돌을보고합니다. 내 코드에는 디버깅을 위해 gdb를 사용하기 때문에 잡을 수없는 다른 버그가있었습니다. –

+0

@amit : jar를 사용하여 C++ 실행 파일을 실행하고 Java 코드베이스에 다른 타사 jar 또는 다른 종속 항아리를 사용하면 ur 지정에 따라 경로를 지정해야합니다. 문제 만 찾을 수 있습니다. – user1808932

답변

0

jni가 일반적으로 잡을 신호를 throw하지만 jdb에서는 gdb가 충돌을보고하게됩니다. 내 코드에는 디버깅을 위해 gdb를 사용했기 때문에 잡을 수없는 매우 평범한 버그가있었습니다.

1

이것은 아마도 포인터가 이미 삭제 된 개체를 가리키고 있기 때문일 수 있습니다. 네이티브 코드를 확인하십시오.

+0

무슨 뜻인지 확실치 않습니다. 이 컨텍스트의 모든 원시 코드는 질문에 있습니다. 나는 여기서 아무것도 삭제하지 않을거야. –

+0

삭제됨은 객체의 메모리 할당이 해제되었음을 의미합니다. –

+0

나는 이해 : 나는 위의 네이티브 코드가 아무 것도 할당 해제하지 않는다는 것을 말하고있다. –