undefined in this scope



  • Hallo,

    Beim kompilieren mit dem Android NDK bekomme ich einen "'CommongetGameVersionStringwasnotdeclaredinthisscopeMSHookFunction(commongetGameVersionString' was not declared in this scope MSHookFunction(commongetGameVersionString, (void*) &versionNameHook, (void**) &Common$getGameVersionString);" error. Woran liegt das? Ich bin grad dabei C++ zu lernen, deswegen ist der Fehler bestimmt so simpel das ich ihn nicht finde ^^".

    static string (*Common$getGameVersionString)(void* p);
    string versionNameHook(void* p) {
        return "Some Text!";
    }
    JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved){
        void* handle = dlopen("libminecraftpe.so", RTLD_LAZY);
        void* common$getGameVersionString = dlsym(handle, "_ZN6Common20getGameVersionStringEv");
        MSHookFunction(common$getGameVersionString, (void*) &versionNameHook, (void**) &Common$getGameVersionString);
        return JNI_VERSION_1_2;
    }
    

    Lg Frosto43


  • Mod

    '$' ist kein gültiges Zeichen in Bezeichnern.

    Wenn du so C++ lernst, wird das nichts. Ich musste erst einmal 5x den Code lesen, bevor ich halbwegs sicher war, dass dies C++ sein könnte. Ich bin mir immer noch nicht sicher, ob es wirklich C++ ist.



  • Das war nicht zum lernen, das war ein Test ;). Ich werde das ganze morgen gleich mal testen, danke für die Hilfe!

    Edit: Ich habe heute aber schon c++ code gesehen, wo static int (*Mouse$getX)(Mouse*); einwandfrei funktioniert hat, lol.


  • Mod

    Frosto43 schrieb:

    Edit: Ich habe heute aber schon c++ code gesehen, wo static int (*Mouse$getX)(Mouse*); einwandfrei funktioniert hat, lol.

    Nun, es ist nicht verboten. Aber wenn du einen derart kurzen Codeausschnitt zeigst, dann ist die naheliegende Antwort, dass das, was nicht unbedingt funktionieren muss, vielleicht die Fehlerursache ist.

    Wobei mir gerade der wahre Fehler auffällt: Du hast den Bezeichner schlichtweg falsch geschrieben. Guck mal genau hin.



  • Frosto43 schrieb:

    Edit: Ich habe heute aber schon c++ code gesehen, wo static int (*Mouse$getX)(Mouse*); einwandfrei funktioniert hat, lol.

    Ja, Visual C++ scheint tatsächlich Dollar-Symbole in Bezeichnern zuzulassen (siehe https://msdn.microsoft.com/en-us/library/565w213d.aspx).

    Das ist dann zwar "C++", allerdings nicht standardkonformes "ISO C++". Es empfiehlt sich also, darauf zu verzichten wenn man portablen Code schreiben möchte.

    Gruss,
    Finnegan



  • Ich sehe keine falsche Schreibweise :o

    CommongetGameVersionString<obenCommongetGameVersionString <- oben CommongetGameVersionString <- unten



  • 😮 Die spinnen, die Redmonder!



  • Edit: murks.



  • Das common$ muss da aber nicht hin, das muss nur am Anfang, ich könnte die Funktion common$getGameVersionString auch umbenennen, dann wäre es nicht mehr ähnlich und wirft immer noch den Fehler 😉


  • Mod

    commongetGameVersionStringCommongetGameVersionString CommongetGameVersionString



  • static string (*Common$getGameVersionString)(void* p);
    string versionNameHook(void* p) {
        return "Some Text!";
    }
    JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved){
        void* handle = dlopen("libminecraftpe.so", RTLD_LAZY);
        void* something = dlsym(handle, "_ZN6Common20getGameVersionStringEv");
        MSHookFunction(something, (void*) &versionNameHook, (void**) &Common$getGameVersionString);
        return JNI_VERSION_1_2;
    }
    

    Verständlicher wenns so ist? Guck mal über deinen Post was ich da geschrieben habe, das habe ich mal oben abgeändert, dann kann deins nicht stimmen 😉


Anmelden zum Antworten