在C ++类方法循环中创建JVM-调用API

时间:2018-11-13 16:27:58

标签: java c++ jvm virtual-machine invocation-api

我已经将Java库包装到C ++类库中,并希望在另一个C ++项目中使用该库。

具体地说,我想在一个类方法中使用该库,该方法读取输入文件,循环遍历文件中的所有元素,然后利用该库执行某些操作。

但是,我试图确切地弄清楚如何正确地调用JVM。此刻,我的代码看起来像这样:

void myclass::method()
{
    for (int OBJECT=1; OBJECT < OBJECT_DATA_SIZE; OBJECT++)
    {

    // CONFIGURE JVM

       JavaVMOption jvmopt[1];
       jvmopt[0].optionString = "-Djava.class.path="
               "/PATH/TO/LIB/ONE.jar:"
               "/PATH/TO/LIB/TWO.jar:"
               "/PATH/TO/LIB/THREE.jar";

       JavaVMInitArgs vmArgs;
       vmArgs.version = JNI_VERSION_10;
       vmArgs.nOptions = 1;
       vmArgs.options = jvmopt;
       vmArgs.ignoreUnrecognized = JNI_FALSE;


    // CREATE THE JVM

       JavaVM *javaVM;
       JNIEnv *env;
       long flag = JNI_CreateJavaVM(&javaVM, (void**)&env, &vmArgs);

       if (flag == JNI_ERR)
       {                                                       // Check for errors and if errors exist
          std::cout << "\nError creating VM. Exiting...\n" << std::endl;           // Output message to console and exit
          env->ExceptionCheck();
          env->ExceptionDescribe();
          std::abort();
       }

       javaVM->DestroyJavaVM();     // If not found, destroy VM
    }
}

每个循环都在破坏并重新创建JVM。第一次迭代运行正常,但是第二个循环失败并崩溃。我猜想这与JVM没有正确关闭有关。日志内容:

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGSEGV (0xb) at pc=0x00007fa7a7d970c3, pid=32015, tid=32015
#
# JRE version: Java(TM) SE Runtime Environment (10.0.2+13) (build 10.0.2+13)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (10.0.2+13, mixed mode, tiered, compressed oops, g1 gc, linux-amd64)
# Problematic frame:
# V  [libjvm.so+0x9180c3]  ThreadStateTransition::transition_from_native(JavaThread*, JavaThreadState) [clone .constprop.232]+0x13
#
# Core dump will be written. Default location: Core dumps may be processed with "/usr/share/apport/apport %p %s %c %d %P" (or dumping to /home/code/myProg/core.32015)
#
# If you would like to submit a bug report, please visit:
#   http://bugreport.java.com/bugreport/crash.jsp
#

---------------  S U M M A R Y ------------

Command Line: 

Host: Intel(R) Xeon(R) Gold 6130 CPU @ 2.10GHz, 32 cores, 62G, Ubuntu 18.04.1 LTS
Time: Tue Nov 13 14:44:44 2018 GMT elapsed time: 0 seconds (0d 0h 0m 0s)

---------------  T H R E A D  ---------------

Current thread is native thread

Stack: [0x00007ffcb58f3000,0x00007ffcb59f3000],  sp=0x00007ffcb59f0490,  free space=1013k
Native frames: (J=compiled Java code, A=aot compiled Java code, j=interpreted, Vv=VM code, C=native code)
V  [libjvm.so+0x9180c3]  ThreadStateTransition::transition_from_native(JavaThread*, JavaThreadState) [clone .constprop.232]+0x13
V  [libjvm.so+0x91b0a4]  jni_ExceptionCheck+0x34


siginfo: si_signo: 11 (SIGSEGV), si_code: 1 (SEGV_MAPERR), si_addr: 0x00000000000002e8

Register to memory mapping:

RAX=
[error occurred during error reporting (printing register info), id 0xb]

Registers:
RAX=0x00007fa7a884facb, RBX=0x0000000000000000, RCX=0x0000000000000b40, RDX=0x0000000000000000
RSP=0x00007ffcb59f0490, RBP=0x00007ffcb59f04a0, RSI=0x00007fa7a610b8c0, RDI=0x0000000000000000
R8 =0x00007fa7a610b8c0, R9 =0x00007fa7a8aed7c0, R10=0x000000000000000a, R11=0x0000000000000000
R12=0x0000556a366a6a70, R13=0x0000000000000001, R14=0x00007ffcb59f09a0, R15=0x0000000000000001
RIP=0x00007fa7a7d970c3, EFLAGS=0x0000000000010206, CSGSFS=0x002b000000000033, ERR=0x0000000000000006
  TRAPNO=0x000000000000000e

Top of Stack: (sp=0x00007ffcb59f0490)
0x00007ffcb59f0490:   0000556a35a370a0 0000556a366a6800
0x00007ffcb59f04a0:   00007ffcb59f04d0 00007fa7a7d9a0a4
0x00007ffcb59f04b0:   0000000000000001 0000556a35a370a0
0x00007ffcb59f04c0:   00007fa7a6e9a0a0 00007fa7a6e9a0a0 

Instructions: (pc=0x00007fa7a7d970c3)
0x00007fa7a7d970a3:   c6 83 29 04 00 00 00 eb 9f 0f 1f 40 00 55 48 89
0x00007fa7a7d970b3:   e5 53 48 89 fb 48 83 ec 08 48 8d 05 08 8a ab 00
0x00007fa7a7d970c3:   c7 87 e8 02 00 00 05 00 00 00 80 38 00 75 0c 48
0x00007fa7a7d970d3:   8d 05 73 a8 b1 00 83 38 01 74 30 48 8d 05 e5 89 


---------------  P R O C E S S  ---------------

VM state:at safepoint (shutting down)

VM Mutex/Monitor currently owned by a thread:  ([mutex/lock_event])
[0x0000556a366a30d0] Threads_lock - owner thread: 0x0000556a36917800

Heap address: 0x00000003d6c00000, size: 16020 MB, Compressed Oops mode: Zero based, Oop shift amount: 3
Narrow klass base: 0x0000000000000000, Narrow klass shift: 3
Compressed class space size: 1073741824 Address: 0x00000007c0000000

Heap:
 garbage-first heap   total 1028096K, used 0K [0x00000003d6c00000, 0x00000007c0000000)
  region size 4096K, 1 young (4096K), 0 survivors (0K)
 Metaspace       used 3331K, capacity 4480K, committed 4480K, reserved 1056768K
  class space    used 280K, capacity 384K, committed 384K, reserved 1048576K
Heap Regions: E=young(eden), S=young(survivor), O=old, HS=humongous(starts), HC=humongous(continues), CS=collection set, F=free, A=archive, TS=gc time stamp, AC=allocation context, TAMS=top-at-mark-start (previous, next)

我应该怎么做?

0 个答案:

没有答案