Мы используем 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, если это уместно.
Большое спасибо