Хорошо, поэтому я пытаюсь включить встроенный JDK в UnrealEngine для запуска кода JavaSE. Код подается динамически через текстовую панель в игре, затем пишется и компилируется. Когда я пытаюсь создать новый объект из этого класса, происходит сбой при вызове JNI NewObje c. Это моя реализация из c ++:
FString javacCommand = (javacPath + filePath);
string stringCommand = string(TCHAR_TO_UTF8(*javacCommand));
UE_LOG(LogTemp, Warning, TEXT("File Created: %s"), *javacCommand);
cout << worked << "\n";
system(stringCommand.c_str());
UE_LOG(LogTemp, Warning, TEXT("Class compiled successfuly"));
try {
jclass clazz = env->FindClass("UserCode");
UE_LOG(LogTemp, Warning, TEXT("Class loaded successfuly"));
// Get the method that you want to call
jmethodID createMaterial = env->GetMethodID(clazz, "createJson", "()V");
UE_LOG(LogTemp, Warning, TEXT("CreateMaterial Method loaded Successfully"));
jmethodID constructor = env->GetMethodID(clazz, "<init>", "void(V)");
UE_LOG(LogTemp, Warning, TEXT("Constructor Method Loaded Successfuly"));
jobject object = env->NewObject(clazz, constructor);
UE_LOG(LogTemp, Warning, TEXT("Created New Object Sucessfully"));
// Call the method on the object
jobject result = env->CallObjectMethod(object, createMaterial);
jstring resultString = (jstring) result;
// Get a C-style string
const char *str = env->GetStringUTFChars(resultString, NULL);
env->ReleaseStringUTFChars(resultString, str);
UE_LOG(LogTemp, Warning, TEXT("Class method invoked successfuly with result: %s"), str);
std::cout << str;
}
Код java:
import com.fasterxml.jackson.databind.ObjectMapper;
import com.gamifycode.*;
import com.gamifycode.craftableitem.*;
import com.gamifycode.enumeration.State;
import java.io.File;
import java.io.IOException;
public class UserCode
{
public UserCode()
{
}
public CraftableItem createCraftableItem() {
return null;
}
public void createJson() throws IOException {
CraftableItem createdItem = createCraftableItem();
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.writeValue(new File("JsonFile.json"), createdItem);
}
}
И stacktrace:
Signal 11 caught.
Malloc Size=65538 LargeMemoryPoolOffset=65554
CommonUnixCrashHandler: Signal=11
Malloc Size=65535 LargeMemoryPoolOffset=131119
Malloc Size=728176 LargeMemoryPoolOffset=859312
[2020.02.01-02.29.54:237][976]LogCore: === Critical error: ===
Unhandled Exception: SIGSEGV: invalid attempt to read memory at address 0x0000000000000000
[2020.02.01-02.29.54:237][976]LogCore: Fatal error!
0x00007fc65569f9bc libjvm.so!JVM_handle_linux_signal(+0x11c)
0x00007fc6556928e8 libjvm.so!UnknownFunction(0x90b8e7)
0x00007fc6ad1f8890 libpthread.so.0!UnknownFunction(0x1288f)
0x00007fc655449067 libjvm.so!UnknownFunction(0x6c2066)
0x00007fc65545de5d libjvm.so!UnknownFunction(0x6d6e5c)
0x00007fc65ddf0742 libUE4Editor-CryptydGameJam-9268.so!JNIEnv_::NewObject(_jclass*, _jmethodID*, ...) [/home/levant/Documents/Repos/Unreal/SlimeCrimeLabs/CryptydGameJam/Source/ThirdParty/jdk1.8.0_211/include/../../jdk1.8.0_211/include/jni.h:872]
0x00007fc65ddefbcb libUE4Editor-CryptydGameJam-9268.so!UCodeInputWidget::compileCode(FText) [/home/levant/Documents/Repos/Unreal/SlimeCrimeLabs/CryptydGameJam/Source/CryptydGameJam/Private/CodeInputWidget.cpp:124]
Любая идея, почему это может происходить