Ошибка сегмента в использовании JNI_CreateJavaVM в оболочке c ++ для python - PullRequest
0 голосов
/ 04 мая 2018

Мы используем JNI для взаимодействия между c ++ и Java Jars в следующей программе:

 #include <stdio.h>
 #include <jni.h>
 #include<string.h>
 #include <iostream>
 // #include <chrono>


 JNIEnv* create_vm(JavaVM **jvm)
 {
     JNIEnv* env;
     JavaVMInitArgs args;
     JavaVMOption options;
     args.version = JNI_VERSION_1_8;
     args.nOptions = 1;
     options.optionString = "-Djava.class.path=jsapi.jar";

     args.options = &options;
     args.ignoreUnrecognized = 0;
     int rv;
     rv = JNI_CreateJavaVM(jvm, (void**)&env, &args);
     if (rv < 0 || !env)
         printf("Unable to Launch JVM %d\n",rv);
     else
         printf("Launched JVM! :)\n");
     return env;
 }

 int main_fn()
 {
     JavaVM *jvm;
     JNIEnv *env;
     env = create_vm(&jvm);
     if(env == NULL)
         return 1;
     //invoke_class(env);
     jvm->DestroyJavaVM();
     return 0;
 }

И он работает, как и ожидалось, после компиляции со следующим:

g ++ -std = c ++ 0x -o out -I jdk1.8.0_144 / include -I jdk1.8.0_144 / include / linux / -L jdk1.8.0_144 / jre / lib / amd64 / server test_jni.cpp -ljvm

Но когда мы используем оболочку swig для вызова main_fn () из python, мы получаем ошибку сегментации со следующей трассировкой стека (не было ошибки при построении кода оболочки swig):

 Received utterance[length=245760] from 10.158.19.119, saved to demo_cache/20180504155105_10.158.19.119.wav.
 *** Aborted at 1525449065 (unix time) try "date -d @1525449065" if you are using GNU date ***
 PC: @                0x0 (unknown)
 *** SIGSEGV (@0x50) received by PID 7060 (TID 0x7fde57e0a700) from PID 80; stack trace: ***
     @     0x7fde579e6390 (unknown)
     @     0x7fde57bfe73c (unknown)
     @     0x7fde57c07851 (unknown)
     @     0x7fde57c02564 (unknown)
     @     0x7fde57c06da9 (unknown)
     @     0x7fde57407f09 (unknown)
     @     0x7fde57c02564 (unknown)
     @     0x7fde57408571 (unknown)
     @     0x7fde57407fa1 dlopen
     @     0x7fde133fce75 os::Linux::clock_init()
     @     0x7fde13400049 os::init()
     @     0x7fde1354cca2 Threads::create_vm()
     @     0x7fde131aae64 JNI_CreateJavaVM
     @     0x7fde13daf06e create_vm()
     @     0x7fde13daf2dc main_fn()
     @     0x7fde13d46af8 _wrap_main_fn
     @           0x4c468a PyEval_EvalFrameEx
     @           0x4c2765 PyEval_EvalCodeEx
     @           0x4ca099 PyEval_EvalFrameEx
     @           0x4c2765 PyEval_EvalCodeEx
     @           0x4ca8d1 PyEval_EvalFrameEx
     @           0x4c2765 PyEval_EvalCodeEx
     @           0x4ca8d1 PyEval_EvalFrameEx
     @           0x4c9d8f PyEval_EvalFrameEx
     @           0x4c2765 PyEval_EvalCodeEx
     @           0x4de6fe (unknown)
     @           0x4b0cb3 PyObject_Call
     @           0x4f492e (unknown)
     @           0x4b0cb3 PyObject_Call
     @           0x4ce5d0 PyEval_CallObjectWithKeywords
     @           0x4e17e4 PyInstance_New
     @           0x4b0cb3 PyObject_Call
 Segmentation fault (core dumped)

Похоже, что есть проблема в использовании потоков с swig. В описании функции JNI_CreateJavaVM говорится, что оно «загружает и инициализирует виртуальную машину Java. Текущий поток становится основным». Который, я думаю, вызывает проблему. (Я не уверен, я могу ошибаться)

Мы обнаружили, что есть опция -threads , которая используется с swig для добавления поддержки потоков, но это также не помогло. Пожалуйста, дайте мне знать, как решить эту проблему, это будет огромная помощь.

Выше оба сценария были протестированы в докере nvidia с образом Ubuntu, если это уместно.

Большое спасибо

...