未找到int org.libsdl.app.SDLActivity.nativeSetupJNI()的实现

时间:2019-04-28 17:19:48

标签: android c sdl-2

首先要确认的是,我浏览了与此类似的所有主题,但没有发现任何可以解决我问题的方法。当我想在手机上运行应用程序时,它会抛出UnsatisfiedLinkError,并且找不到int org.libsdl.app.SDLActivity.nativeSetupJNI()的实现。

04-28 16:56:13.081 17793 17793 E art     : No implementation found for int org.etlegacy.app.SDLActivity.nativeSetupJNI() (tried Java_org_etlegacy_app_SDLActivity_nativeSetupJNI and Java_org_etlegacy_app_SDLActivity_nativeSetupJNI__)
04-28 16:56:13.082 17793 17793 D AndroidRuntime: Shutting down VM
04-28 16:56:13.082 17793 17793 E AndroidRuntime: FATAL EXCEPTION: main
04-28 16:56:13.082 17793 17793 E AndroidRuntime: Process: org.etlegacy.app, PID: 17793
04-28 16:56:13.082 17793 17793 E AndroidRuntime: java.lang.UnsatisfiedLinkError: No implementation found for int org.etlegacy.app.SDLActivity.nativeSetupJNI() (tried Java_org_etlegacy_app_SDLActivity_nativeSetupJNI and Java_org_etlegacy_app_SDLActivity_nativeSetupJNI__)
04-28 16:56:13.082 17793 17793 E AndroidRuntime:    at org.etlegacy.app.SDLActivity.nativeSetupJNI(Native Method)
04-28 16:56:13.082 17793 17793 E AndroidRuntime:    at org.etlegacy.app.SDL.setupJNI(SDL.java:15)
04-28 16:56:13.082 17793 17793 E AndroidRuntime:    at org.etlegacy.app.SDLActivity.onCreate(SDLActivity.java:234)
04-28 16:56:13.082 17793 17793 E AndroidRuntime:    at android.app.Activity.performCreate(Activity.java:6857)
04-28 16:56:13.082 17793 17793 E AndroidRuntime:    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119)
04-28 16:56:13.082 17793 17793 E AndroidRuntime:    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2676)
04-28 16:56:13.082 17793 17793 E AndroidRuntime:    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2784)
04-28 16:56:13.082 17793 17793 E AndroidRuntime:    at android.app.ActivityThread.-wrap12(ActivityThread.java)
04-28 16:56:13.082 17793 17793 E AndroidRuntime:    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1523)
04-28 16:56:13.082 17793 17793 E AndroidRuntime:    at android.os.Handler.dispatchMessage(Handler.java:102)
04-28 16:56:13.082 17793 17793 E AndroidRuntime:    at android.os.Looper.loop(Looper.java:163)
04-28 16:56:13.082 17793 17793 E AndroidRuntime:    at android.app.ActivityThread.main(ActivityThread.java:6238)
04-28 16:56:13.082 17793 17793 E AndroidRuntime:    at java.lang.reflect.Method.invoke(Native Method)
04-28 16:56:13.082 17793 17793 E AndroidRuntime:    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904)
04-28 16:56:13.082 17793 17793 E AndroidRuntime:    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794)
04-28 16:56:13.091  3424  3645 D PowerKeeper.Event: notifyAMCrash packageName: 0, pid:17793

曾经尝试添加JNIEXPORT和JNICALL,但没有成功。 我将提供来自3个不同文件的一些代码。

sys.android.c

#include "jni.h"
/*******************************************************************************
                 Functions called by JNI
*******************************************************************************/

/* Start up the ET Legacy app */
JNIEXPORT void JNICALL Java_org_etlegacy_app_SDLActivity_nativeInit(JNIEnv *env, jobject obj)
{
    Android_JNI_SetupThread();

    SDL_SetMainReady();

    /* Run the application code! */
    char *argv[2];
    argv[0] = SDL_strdup("ET Legacy");
    // send r_fullscreen 0 with argv[1] because on fullscreen can cause some issues see: https://github.com/rafal1137/android-project/commit/d960cc244b17d8cc0d084f9c8dad9c1af4b2ba72#diff-b9bd293cfb066fe80c10d3fcdd0fd6cbL439
    argv[1] = 0;
    SDL_main(1, argv);

}

sys_main.c

/**
 * @brief SDL_main
 * @param[in] argc
 * @param[in] argv
 * @return
 */
int main(int argc, char **argv)
{
    char commandLine[MAX_STRING_CHARS] = { 0 };

    Sys_PlatformInit();

    // Set the initial time base
    Sys_Milliseconds();

#ifdef __APPLE__
    // This is passed if we are launched by double-clicking
    if (argc >= 2 && Q_strncmp(argv[1], "-psn", 4) == 0)
    {
        argc = 1;
    }
#endif

    Sys_ParseArgs(argc, argv);

#if defined(__APPLE__) && !defined(DEDICATED)
    // argv[0] would be /Users/seth/etlegacy/etl.app/Contents/MacOS
    // But on OS X we want to pretend the binary path is the .app's parent
    // So that way the base folder is right next to the .app allowing
    {
        char     parentdir[1024];
        CFURLRef url = CFBundleCopyBundleURL(CFBundleGetMainBundle());
        if (!url)
        {
            Sys_Dialog(DT_ERROR, "A CFURL for the app bundle could not be found.", "Can't set Sys_SetBinaryPath");
            Sys_Exit(EXIT_FAILURE);
        }

        CFURLRef url2 = CFURLCreateCopyDeletingLastPathComponent(0, url);
        if (!url2 || !CFURLGetFileSystemRepresentation(url2, 1, (UInt8 *)parentdir, 1024))
        {
            Sys_Dialog(DT_ERROR, "CFURLGetFileSystemRepresentation returned an error when finding the app bundle's parent directory.", "Can't set Sys_SetBinaryPath");
            Sys_Exit(EXIT_FAILURE);
        }

        Sys_SetBinaryPath(parentdir);

        CFRelease(url);
        CFRelease(url2);
    }
#else
    Sys_SetBinaryPath(Sys_Dirname(argv[0]));
#endif

    Sys_SetDefaultInstallPath(DEFAULT_BASEDIR); // Sys_BinaryPath() by default

    // Concatenate the command line for passing to Com_Init
    Sys_BuildCommandLine(argc, argv, commandLine, sizeof(commandLine));

    Com_Init(commandLine);
    NET_Init();

    Sys_SetUpConsoleAndSignals();

#ifdef _WIN32

#ifndef DEDICATED
    if (com_viewlog->integer)
    {
        Sys_ShowConsoleWindow(1, qfalse);
    }
#endif

    Sys_Splash(qfalse);

    {
        char cwd[MAX_OSPATH];
        _getcwd(cwd, sizeof(cwd));
        Com_Printf("Working directory: %s\n", cwd);
    }

    // hide the early console since we've reached the point where we
    // have a working graphics subsystems
#ifndef LEGACY_DEBUG
    if (!com_dedicated->integer && !com_viewlog->integer)
    {
        Sys_ShowConsoleWindow(0, qfalse);
    }
#endif

#endif

    Sys_GameLoop();

    return EXIT_SUCCESS;
}

SDLActivity.java

protected String[] getLibraries() {
        return new String[] {
            "SDL2",
            "hidapi",
            "etl"
        };
    }

我应该删除SDL_main(1,argv);从sys_android.c文件中提取,以便它可以从sys_main.c中选择正确的文件?

1 个答案:

答案 0 :(得分:0)

问题似乎是在函数名称方面的错字,正确的是Java_org_etlegacy_app_SDLActivity_nativeSetupJNI()