2014-01-31 2 views
0

Я знаю, что до сих пор этот вопрос был задан до смерти, но ни одно из решений, которые я читал, не работало для меня, поэтому я подумал, что посмотрю, сможет ли кто-нибудь придумать новый ответ.UnsatisfiedLinkError: Родной метод не найден

Вот код Java:

private native int nativeVideoPlayerMain(String fileName, int loop,int audioFileType, 
     int skipFrames, int rgb565, int yuvRgbAsm, int skipBidirFrames, int queueSizeMin, int queueSizeMax, int queueSizeTotal, int queueSizeAudio, 
     int fastMode, int debugMode, int syncType, int seekDuration, int ffmpegFlags); 

в пакете com.example.player и класса DemoRenderer.

Вот родное определение кода:

 extern C_LINKAGE int 
     Java_com_example_player_DemoRenderer_nativeVideoPlayerMain(JNIEnv* env, 
     jobject obj, 
     jstring jfileName, 
     jint loopAfterPlay, 
     jint audioFileType, 
     jint skipFrames, 
     jint rgb565, 
     jint yuvRgbAsm, 
     jint skipBidirFrames, 
     jint queueSizeMin, 
     jint queueSizeMax, 
     jint totalQueueSize, 
     jint audioQueueSize, 
     jint fastMode, 
     jint debugMode, 
     jint syncType, 
     jint seekDuration, 
     jint ffmpegFlags) 
    { 
    jboolean isCopy; 

int argc = 1; 

    int my_loop_after_play; 
    int my_audio_file_type; 
    int my_skip_frames; 
    int my_rgb_565; 
    int my_yuv_rgb_asm; 
    int my_skip_bidir_frames; 
    int my_queue_size_min; 
    int my_queue_size_max; 
    int my_total_queue_size; 
    int my_audio_queue_size; 
    int my_fast_mode; 
    int my_debug_mode; 
    int my_sync_type; 
    int my_seek_duration; 
    int my_ffmpeg_flags; 

    #ifdef BROOV_C 
    const char *fileString = (*env)->GetStringUTFChars(env, jfileName, &isCopy); 
    #else 
    const char *fileString  = env->GetStringUTFChars(jfileName, &isCopy); 
    #endif 
    char lclFileName[FILE_NAME_SIZE]; 

    strncpy(lclFileName, fileString, FILE_NAME_SIZE); 

    #ifdef BROOV_C 
    (*env)->ReleaseStringUTFChars(env, jfileName, fileString); 
    #else 
    env->ReleaseStringUTFChars(jfileName, fileString); 
    #endif 

char *argv[] = { lclFileName }; 

    my_loop_after_play = loopAfterPlay; 
    my_audio_file_type = audioFileType; 
    my_skip_frames = skipFrames; 
    my_rgb_565 = rgb565; 
    my_yuv_rgb_asm = yuvRgbAsm; 
    my_skip_bidir_frames = skipBidirFrames; 
    my_queue_size_min = queueSizeMin; 
    my_queue_size_max = queueSizeMax; 
    my_total_queue_size= totalQueueSize; 
    my_audio_queue_size= audioQueueSize; 
    my_fast_mode = fastMode; 
    my_debug_mode = debugMode; 
    my_sync_type= syncType; 
    my_seek_duration= seekDuration; 
    my_ffmpeg_flags = ffmpegFlags; 

    return video_player_main(argc, argv, my_loop_after_play, my_audio_file_type, 
         my_skip_frames, my_rgb_565, my_yuv_rgb_asm, 
         my_skip_bidir_frames, my_queue_size_min, my_queue_size_max,  
    my_total_queue_size, my_audio_queue_size, my_fast_mode, my_debug_mode, 
    my_sync_type, my_seek_duration, my_ffmpeg_flags); 

    } 

Другие методы из этого файла будут найдены и успешно выполнена, но это один отказывается сделать это. Я запускал ndk-build clean и ndk-build несколько раз, но метод не найден. Если у кого есть какие-либо предложения, пожалуйста, поделитесь :)

EDIT: Того сообщения об ошибке:

W/dalvikvm(18569): threadid=11: thread exiting with uncaught exception (group=0x41c94ba8) 
E/AndroidRuntime(18569): FATAL EXCEPTION: GLThread 
E/AndroidRuntime(18569): Process: com.example.player, PID: 18569 
E/AndroidRuntime(18569): java.lang.UnsatisfiedLinkError: Native method not found: com.example.player.DemoRenderer.nativeVideoPlayerMain:(Ljava/lang/String;IIIIIIIIIIIIIII)I 
E/AndroidRuntime(18569): at com.example.player.DemoRenderer.nativeVideoPlayerMain(Native Method) 
E/AndroidRuntime(18569): at com.example.player.DemoRenderer.onDrawFrame(DemoRenderer.java:43) 
E/AndroidRuntime(18569): at com.example.player.GLSurfaceView_SDL$GLThread.run(GLSurfaceView_SDL.java:944) 
W/ActivityManager( 509): Force finishing activity com.example.player/.PlayerActivity 

Update: Как я пытался проверить функцию действительно загружен в его библиотеке, я обнаружил, не знаю, в какой библиотеке это. То, что я имею в виду следующее:

  • Когда я делаю это: Grep -R «nativePlayerInit» * -n (это другая функция в том же файле, что у меня нет проблемы с загрузкой) Я получаю это, среди прочего:

Бинарные ЛИЭС файл/armeabi-v7a/libapplication.so соответствует

Двоичный файл OBJ/локальный/armeabi-v7a/libapplication.so соответствует

двоичный файл OBJ/локальный/armeabi-v7a/Objs/приложение /src/native_main.o соответствует

  • Когда я делаю это для nativeVideoPlayerMain, я не получаю никаких совпадений со статическими объектами.

  • Самое странное, что я получаю эквивалентный результат, когда я grep файлы исходного и рабочего проекта.

Итак, подведем все вверх его: как это возможно оригинальный проект, который будет работать правильно, если функция не кажется, должны быть загружены в любой из его статических объектов? Может ли он иметь статические объекты где-то из своего каталога?

+0

Какая у вас ошибка? – eozgonul

+0

Дубликат http://stackoverflow.com/questions/21480981/jni-exception-in-thread-awt-eventqueue-0-java-lang-unsatisfiedlinkerror. Смотрите мой ответ. Та же проблема: такое же решение. – EJP

+0

Я не уверен, что вы имеете в виду, но если я не думаю, что джава исправит проблему, потому что у меня нет проблем с другими функциями, только с этим конкретным. – ProgrammingGivesMeHeadaches

ответ

0

OK, функция выбрасывала неудовлетворенную ошибку ссылки, потому что ... это была неправильная функция. Я не знаю, как, но мне удалось скопировать и полностью заблокировать неправильную функцию - nativeVideoPlayerMain, а не nativePlayerMain. Причина nativeVideoPlayerMain, которую я так тщательно изучала, не была найдена в каких-либо библиотеках, потому что это было в #ifdef, что никогда не было истинным в обоих проектах. Извините за то, что тратишь время всех :)

0

Возможно, у вас есть функция Java_com_example_xformplayer_DemoRenderer_nativeVideoPlayerMain, которой не хватает пареметра. Вы можете использовать «javah» для создания правильного файла заголовка c.

+0

Ну, дело в том, что я не написал код, но скопировал весь каталог jni из рабочего проекта в новый. Эта функция, кажется, не определена в каких-либо файлах заголовков (проверяется с помощью «grep -R» nativeVideoPlayerMain «» в моих и рабочих каталогах проекта), и я боюсь, что если я использую javah, я нанесу гораздо больший урон , – ProgrammingGivesMeHeadaches

0

Если функция не отображается в общей общей библиотеке, это, вероятно, проблема с сборкой. Это может быть несколько причин:

1) Функция никогда не компилируется, например. вы забыли перечислить его исходный файл в LOCAL_SRC_FILES. Самый простой способ проверить это - добавить в него «#error BOOO», а затем перестроить с помощью ndk-build. Это вы не видите соответствующее сообщение об ошибке компилятора, ваш исходный файл не скомпилирован.

2) Функция построена, но удалена из окончательной общей библиотеки, потому что никто ее не использует. Это может произойти, если ваша функция является частью статической библиотеки, которая позже связана с вашей окончательной общей библиотекой. По умолчанию статический компоновщик будет извлекать только символы из статической библиотеки, которые эффективно используются собственными функциями вашей общей библиотеки и их транзитивными зависимостями. Один из способов предотвратить это - использовать LOCAL_WHOLE_STATIC_LIBRARIES вместо LOCAL_STATIC_LIBRARIES, прочитайте $ NDK/docs/SANDROID-MK.TXT для получения более подробной информации.

Еще одно альтернативное решение - переместить определение функции в собственные исходные файлы общей библиотеки.

+0

Спасибо за ваш ответ, но 1) Источник скомпилирован наверняка, потому что у меня есть другая функция из этого файла, которая работает без проблем. 2) Некоторые из них немного над моей головой, и я не уверен, как ответить на него, но я не думаю, что это проблема, потому что, как я уже сказал, когда я grep для имени функции в обоих рабочие и неработающие каталоги проектов, я получаю те же результаты для того, где функция найдена. Даже в рабочем проекте функция не найдена в application.so, что действительно оставляет меня озадаченным. Может ли она быть добавлена ​​во время выполнения? – ProgrammingGivesMeHeadaches

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