2012-04-10 9 views
3

Ich habe eine Bibliothek erfolgreich aus dem Verzeichnis /system/libs/my_lib.so geladen. Wie kann ich die C/C++ - Funktionen verwenden, die in dieser Bibliothek definiert sind?System.load zum Laden der Bibliothek

public class MainFrom extends Activity { 

    private static final String LOG_TAG = "MainFrom"; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     // How to use the functions of test_lib.so? 

     /* 
      java.lang.UnsatisfiedLinkError: stringFromC 


     String s1 = stringFromC(), s2 = stringFromCpp(); 

     Log.w(LOG_TAG, stringFromC()); 
     Log.w(LOG_TAG, stringFromCpp()); */ 
    } 

    public native String stringFromC(); 
    public native String stringFromCpp(); 

    static { 
     try { 
      System.load("/system/lib/test_lib.so"); 
      Log.i(LOG_TAG, "MainFrom. Success!"); 
     } catch (UnsatisfiedLinkError e) { 
      Log.e(LOG_TAG, "MainFrom. UnsatisfiedLinkError"); 
     } 
    } 

} 

stringFromC und stringFromCpp existieren in .c und .cpp Dateien, die

+0

können Sie Ihre Android.mk Datei teilen und auch .c und .cpp? –

+0

@NISHANt Wie teilen? Ich baue Cyanogen, meine Testbibliothek befindet sich im "externen" Ordner, die Verwendung von c- und cpp-Funktionen befindet sich im Ordner "framesworks". –

+0

Aktiencode wenn möglich. –

Antwort

3

Ich habe mein Problem gelöst.

Es war notwendig,

System.load("/system/lib/libtest_lib.so"); 

statt

System.load("/system/lib/test_lib.so"); 

So seltsam zu schreiben. Wenn ich rufe

adb shell 
ls /system/lib 

Ich sehe test_lib.so Datei. Warum wird die Bibliothek unter Verwendung des Präfixes lib korrekt geladen?

+0

Nein, das Präfix lib muss nicht verwendet werden. Wenn Sie JNI-Funktionen von ANDROID_SOURCES/external/your_lib/verwenden möchten, sollten Sie sie 'Java_com_your_pack_name_YourClass_yourJniMethod' nennen und einen statischen Initialisierungsblock erstellen, der 'System.load ("/system/lib/test.so ")' –

+0

enthält ist alt, aber kannst du erklären, was du oben gesagt hast? Ich versuche eine Bibliothek aus/storage (interner Speicher) einzubinden –

0

-test_lib.so zusammengestellt wurden Sie müssen LOCAL_CPPFLAGS := $(YOURMODULE_CPPFLAGS) und in LOCAL_SRC_FILES := yourfile.cpp in Ihrer Android.mk Datei setzen CPP-Datei mit Android NDK zu kompilieren.

Ich hoffe, es wird Ihnen helfen.

0

Ab Android 7.0 verhindert das System, dass Anwendungen dynamisch mit Nicht-NDK-Bibliotheken verknüpft werden, was zum Absturz Ihrer App führen kann. Diese Verhaltensänderung zielt darauf ab, ein einheitliches App-Erlebnis für Plattform-Updates und verschiedene Geräte zu schaffen.

android 7.0 changes description

Verwandte Themen