2016-03-21 7 views
1

У меня есть собственная библиотека («процессор»), которую я создаю с помощью Android NDK, которая зависит от libjpeg. Тем не менее эта проблема может быть не связана с аспектом Android. Я успешно построил библиотеку, но когда я пытаюсь запустить библиотеку не удается правильно загрузить с этой ошибкой:Не удается найти символ

failed: dlopen failed: cannot locate symbol "jpeg_mem_src" 

Однако, если я nm -D processor.so он действительно содержит символы:

... 
U jpeg_CreateCompress 
U jpeg_CreateDecompress 
U jpeg_destroy_compress 
U jpeg_destroy_decompress 
U jpeg_finish_compress 
U jpeg_finish_decompress 
U jpeg_mem_dest 
U jpeg_mem_src 
U jpeg_read_header 
U jpeg_read_scanlines 
... 

процессор build.gradle:

sources { 
    main { 
     jni { 
      dependencies { 
       project ":jpeg" 
      } 
     } 
    } 
} 

ndk { 
    moduleName "processor" 
    cppFlags.add("-fexceptions") 
    ldLibs.add("log") 
    stl "gnustl_shared" 
} 

Java-сторона загружает его с:

static 
{ 
    try 
    { 
     Log.i("JNI", "Trying to load lib"); 
     System.loadLibrary("gnustl_shared"); 
     System.loadLibrary("processor"); 
    } 
    catch (UnsatisfiedLinkError ule) 
    { 
     Log.e("JNI", ule.toString()); 
    } 
} 

Любая идея, почему символы существуют, но не могут быть найдены? Благодаря!

ответ

2

В зависимости от Android версии, вам придется загрузить библиотеку в формате JPEG вручную (и включить его в свой APK тоже!)

Так просто добавьте System.loadLibrary("jpeg"); в свой статический блок, и он должен сделать трюк.

Btw, факт, что вы можете видеть символы в своем файле .so, означает, что ваш файл использует их, а не то, что ваш .so обеспечивает реализацию. Вы можете видеть это как nm сообщает символы с письмом U, для undefined.

+0

Ах, спасибо. Так что, если они не определены «U», то, возможно, я сделал что-то неправильно в создании библиотеки? (Я попытался добавить 'System.loadLibrary (" jpeg ")', но я получаю ту же ошибку, поэтому возможно, что по какой-то причине я создаю все библиотеки неправильно) – Anthony

+0

В libjpeg.so: 000000000001dca0 T jpeg_mem_src – Anthony

+0

Ваша библиотека зависит от libjpeg (как указано в блоке зависимости в файле build.gradle). Это означает, что вашей библиотеке нужен файл 'libjpeg.so' для загрузки, прежде чем он может быть загружен сам. Вы можете проверить это, запустив 'readelf -d' в вашем файле, ti покажет ваши другие необходимые общие библиотеки. Вы можете смело игнорировать libc, поскольку он всегда загружается Android, но вы должны загрузить остальные вручную. – NiBZ

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