Крашится Java класс с динамической библиотекой под капотом. Библиотека основана на QCoreAppliacation. Помогите собрать, если это возможно?
$ cat src/wrapper/Client.java
package wrapper;
import java.io.IOException;
public class Client {
native long create();
native void start(long ptr);
static {
System.load(System.getProperty("user.dir")+"/bin/libclient.so");
}
public static void main(String[] args) throws Exception{
Client client = new Client();
long ptr = client.create();
client.start(ptr);
char ch;
ch = (char) System.in.read();
}
}
Заголовочный JNI файл сгенерирован был автоматически
$ cat bin/wrapper_Client.h
#include <jni.h>
#ifndef _Included_wrapper_Client
#define _Included_wrapper_Client
#ifdef __cplusplus
extern "C" {
#endif
JNIEXPORT jlong JNICALL Java_wrapper_Client_create
(JNIEnv *, jobject);
JNIEXPORT void JNICALL Java_wrapper_Client_start
(JNIEnv *, jobject, jlong);
#ifdef __cplusplus
}
#endif
#endif
Реализация JNI:
$ cat bin/wrapper_Client.cpp
#include "wrapper_Client.h"
#include "qlibrary.h"
JNIEXPORT jlong JNICALL Java_wrapper_Client_create (JNIEnv *, jobject)
{
jlong jresult = 0;
Controller *controller;
runApp(controller);
*(Controller**) &jresult = controller;
return jresult;
}
JNIEXPORT void JNICALL Java_wrapper_Client_start (JNIEnv *, jobject, jlong jptr)
{
Controller *controller;
controller = *(Controller **) &jptr;
start(controller);
}
Команда сборки
g++ -std=c++11 -shared -fPIC -DQLIBRARY_LIBRARY -DQT_DEPRECATED_WARNINGS -DQT_NO_DEBUG -DQT_CORE_LIB -I. -isystem /usr/include/x86_64-linux-gnu/qt5 -isystem /usr/include/x86_64-linux-gnu/qt5/QtCore -I. -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++ -o libclient.so -I/usr/lib/jvm/java-11-openjdk-amd64/include/ -I/usr/lib/jvm/java-11-openjdk-amd64/include/linux/ wrapper_Client.cpp -lqlibrary -lQt5Core -lpthread
Имеется библиотека libqlibrary.so. Она установлена в системе и в С++ приложении нормально работает.
class Controller;
void runApp(Controller*&);
void start(Controller*&);
...
void runApp(Controller* &controller)
{
std::thread th
(
[&]
{
int argc = 0;
char *argv = nullptr;
QCoreApplication app(argc, &argv);
controller = new Controller;
app.exec();
}
);
th.detach();
}
void start(Controller*& controller)
{
controller->start();
}
...
Запустить байт код не удается:
$ java -classpath bin wrapper.Client
#
# A fatal error has been detected by the Java Runtime Environment:
#
# SIGSEGV (0xb) at pc=0x00007f4c9a4d08f4, pid=26982, tid=26984
#
# JRE version: OpenJDK Runtime Environment (11.0.7+10) (build 11.0.7+10-post-Ubuntu-2ubuntu218.04)
# Java VM: OpenJDK 64-Bit Server VM (11.0.7+10-post-Ubuntu-2ubuntu218.04, mixed mode, sharing, tiered, compressed oops, g1 gc, linux-amd64)
# Problematic frame:
# V [libjvm.so+0x7178f4]