2012-04-10 3 views
3

Я загрузил библиотеку из каталога /system/libs/my_lib.so. Как я могу использовать функции C/C++, определенные в этой библиотеке?Загрузка библиотеки для загрузки библиотеки

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 и stringFromCpp существуют в .c и .cpp файлах, которые были составлены в test_lib.so

+0

вы можете использовать файл Android.mk, а также .c и .cpp? –

+0

@NISHAnT Как поделиться? Я строю Cyanogen, моя тестовая библиотека находится в «внешней» папке, использование функций c и cpp находится в папке «framesworks». –

+0

код общего доступа, если это возможно. –

ответ

3

Я решил свою проблему.

Надо было написать

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

вместо

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

Так странно. Если я запустил

adb shell 
ls /system/lib 

Я увижу файл test_lib.so. Почему правильно загружать библиотеку с помощью lib префикс?

+0

Нет, нет необходимости использовать префикс lib. Если вы хотите использовать функции JNI из ANDROID_SOURCES/external/your_lib /, вы должны называть их 'Java_com_your_pack_name_YourClass_yourJniMethod' и создавать статический блок инициализации, содержащий' System.load ("/ system/lib/test.so") ' –

+0

Я знаю это старый, но можете ли вы объяснить, что вы сказали выше? Я пытаюсь включить библиотеку из/storage (внутреннее хранилище) –

0

вам нужно поставить LOCAL_CPPFLAGS := $(YOURMODULE_CPPFLAGS) и в LOCAL_SRC_FILES := yourfile.cpp в вашем Android.mk файла компилировать файл .cpp с андроидом НКА.

Надеюсь, это поможет вам.

0

Начиная с Android 7.0 система предотвращает динамическую связь приложений от не-NDK-библиотек, что может привести к сбою приложения. Это изменение в поведении направлено на создание согласованного опыта приложений в обновлениях платформы и разных устройствах.

android 7.0 changes description

Смежные вопросы