UknownFunction при вызове NewObject для JNI.H - PullRequest
0 голосов
/ 01 февраля 2020

Хорошо, поэтому я пытаюсь включить встроенный 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]

Любая идея, почему это может происходить

...