Jak volat Java metody z C ++ v JNI

hlasů
1

Tak píšu aplikaci pro Android, který využívá velký knihovna C ++. Mám všechno, co pracuje tak, že java aplikace může volat C ++ metod delegování, ale jsem najít sám sebe, kteří chtějí bych mohl přihlásit zprávy od c ++ do protokolu systému Android. To je snadné z Javy, ale já jsem na rozpacích, jak volat java metody z C ++. Moje hledání našli způsoby otevírání JVM z C ++, což není vůbec to, co chci dělat. V ideálním případě bych chtěl předat metodu log ukazatel na C ++, které by pak mohly být použity kdykoliv jsem chtěl. Samozřejmě, java nepodporuje ukazatelů metod. Můj java metoda by vypadat nějak takto:

private void log(String s){
   Log.i(Tag, s);     // Android log
}

Já prostě nevím, jak umožnit c ++ pro přístup k této metody.

Položena 10/10/2010 v 21:31
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
6

C ++ volání couta printf nezobrazí se ve výstupu Logcat. Existují dvě řešení.

  1. Použijte protokolování makra poskytnutých NDK, který vám umožní přihlásit zprávy Logcat. To je dobré pro nový kód a obálky kód píšete, ale ne tak dobré, když máte knihovnu plnou stávajících výkazů ladění. I definovat makra následovně:

    #define LOG_INFO(info) __android_log_write(ANDROID_LOG_INFO,"JNI",info)
    #define LOG_ERROR(error) __android_log_write(ANDROID_LOG_ERROR,"JNI",error)
    

    a poté do zdrojového kódu můžu zavolat LOG_INFO("Library is called!");

  2. Zachytit standardní out / standardní chybu programu a cesty do Logcat. Z Android Debug Bridge stránce:

    Prohlížení stdout a stderr

    Ve výchozím nastavení systému Android posílá stdout a stderr (System.out a System.err) výstup do / dev / null. V procesech, které probíhají v Dalvik VM, můžete mít systém napsat kopii výstup do souboru protokolu. V tomto případě systém zapíše zprávy do protokolu pomocí protokolu značky stdout a stderr, a to jak s prioritním I.

    Směrovat výstup tímto způsobem, zastavit běžící emulátoru / instance zařízení a poté použijte příkaz shell SetProp umožňující přesměrování výstupu. Zde je návod, jak to udělat:

      $ adb shell stop
      $ adb shell setprop log.redirect-stdio true
      $ adb shell start
    

    Systém zachová toto nastavení, dokud ukončit instanci emulátoru / zařízení. Chcete-li použít nastavení jako výchozí v instanci emulátoru / zařízení, můžete přidat položku do /data/local.prop na zařízení.

Odpovězeno 10/10/2010 v 23:31
zdroj uživatelem

hlasů
0

Protokolování je umístěna v ‚#include‘ záhlaví souboru.

Chcete-li propojit .so, místo 'LOCAL_LDLIBS: = -L $ (SYSROOT) / usr / lib -llog' si make souboru.

Odpovězeno 10/10/2010 v 22:09
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more