Mam zintegrowane dwie biblioteki natywne (.so) w mojej aplikacji. Biblioteki kompilują się dobrze i mogę je załadować również w mojej aplikacji. Za pierwszym razem, gdy wywoływam natywną metodę biblioteki, działa ona dobrze, ale jeśli ponownie wywołaję tę samą metodę w działaniu, aplikacja wyłączy się.Wywołanie natywnej metody dwukrotnie w bibliotece innej firmy w działaniu powoduje zamknięcie aplikacji Android.
Problem jestem stoi jest dokładnie taka sama, jak wspomniano tutaj:
http://grokbase.com/t/gg/android-ndk/1226m68ydm/app-exit-on-second-native-call
Rozwiązanie to działa jest do wywołania metody natywnej w innej działalności i mocno go zamknąć poprzez System.exit (0) . Po artykule próbowałem ustawić wskaźniki na NULL wywołanej metody po udanej operacji, ale to też nie pomogło mi. Nie można również wyładować biblioteki po załadowaniu jej przez System.loadLibrary().
Chcę wywoływać metody natywne więcej niż raz bez tworzenia nowej aktywności. Wszelkie pomysły, jak rozwiązać ten problem?
(I w końcu znalazłem rozwiązanie ... to jest tutaj)
Dobra, w końcu znalazł sposób na rozwiązanie tego problemu. Rozwiązanie jest naprawdę proste. Zbuduj inną niezależną bibliotekę natywną (bibliotekę narzędziową), aby załadować i wyładować inne biblioteki. Musimy użyć dlopen() i dlclose() w natywnej metodzie narzędzia. Możemy wczytać bibliotekę narzędzi jak wcześniej przez System.loadLibrary().
Więc w natywnej metody biblioteki użytkowego, co musimy zrobić, to: funkcje
Zastosowanie #include <dlfcn.h>
// to jest wymagane, aby zadzwonić dlopen() i dlclose().
Zapewnienie przewodnika i function prototype:
void *handle;
typedef int (*func)(int); // define function prototype
func myFunctionName; // some name for the function
otworzyć bibliotekę przez dlopen():
handle = dlopen("/data/data/my.package.com/lib/somelibrary.so", RTLD_LAZY);
Uzyskaj i wywołać funkcję biblioteki:
myFunctionName = (func)dlsym(handle, "actualFunctionNameInLibrary");
myFunctionName(1); // passing parameters if needed in the call
Teraz, gdy połączenie jest zakończone. Zamknij go przez dlclose():
dlclose(handle);
Mam nadzieję, że pomoże to innym osobom zmierzyć się z tym samym problemem.
gdzie robisz dlclose (uchwyt)? Mam na myśli kod Aktywności lub JNI? –
Jest to kod JNI. Jest to funkcja dostępna przez plik nagłówkowy dlfcn.h. – ZakiMak
OK, widzę, że ładujesz i zwalniasz inne biblioteki w tej klasie c. Ale w jaki sposób powinienem połączyć go z moim kodem Java? –