У меня есть собственная библиотека («процессор»), которую я создаю с помощью 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());
}
}
Любая идея, почему символы существуют, но не могут быть найдены? Благодаря!
Ах, спасибо. Так что, если они не определены «U», то, возможно, я сделал что-то неправильно в создании библиотеки? (Я попытался добавить 'System.loadLibrary (" jpeg ")', но я получаю ту же ошибку, поэтому возможно, что по какой-то причине я создаю все библиотеки неправильно) – Anthony
В libjpeg.so: 000000000001dca0 T jpeg_mem_src – Anthony
Ваша библиотека зависит от libjpeg (как указано в блоке зависимости в файле build.gradle). Это означает, что вашей библиотеке нужен файл 'libjpeg.so' для загрузки, прежде чем он может быть загружен сам. Вы можете проверить это, запустив 'readelf -d' в вашем файле, ti покажет ваши другие необходимые общие библиотеки. Вы можете смело игнорировать libc, поскольку он всегда загружается Android, но вы должны загрузить остальные вручную. – NiBZ