Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

java.lang.UnsatisfiedLinkError: org.bytedeco.javacpp.avutil when trying to grabber.start(); #376

Closed
vxhviet opened this issue Apr 4, 2016 · 4 comments

Comments

@vxhviet
Copy link

vxhviet commented Apr 4, 2016

Dear JavaCV developers, thanks you for creating this awesome tool.

However, I currently having a crash when trying to call grabber.start();, my code snippet:

FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(mVideoPath);

        try {
            grabber.start();
            grabber.setFrameNumber((int) (currentVideoPosition * grabber.getFrameRate() / 1000)); //get current frame base on framerate
            Frame frame = grabber.grabImage();
            AndroidFrameConverter androidFrameConverter = new AndroidFrameConverter();
            Bitmap bitmap = androidFrameConverter.convert(frame);

            return  bitmap;
        }
        catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                grabber.stop();
            } catch (FrameGrabber.Exception e) {
                e.printStackTrace();
            }
        }

with this stack trace:

FATAL EXCEPTION: main
    Process: com.example.viet.myappdemo, PID: 11353
    java.lang.UnsatisfiedLinkError: org.bytedeco.javacpp.avutil
        at java.lang.Class.classForName(Native Method)
        at java.lang.Class.forName(Class.java:324)
        at org.bytedeco.javacpp.Loader.load(Loader.java:442)
        at org.bytedeco.javacpp.Loader.load(Loader.java:407)
        at org.bytedeco.javacpp.avformat$AVFormatContext.<clinit>(avformat.java:2719)
        at org.bytedeco.javacv.FFmpegFrameGrabber.startUnsafe(FFmpegFrameGrabber.java:386)
        at org.bytedeco.javacv.FFmpegFrameGrabber.start(FFmpegFrameGrabber.java:380)
        at com.example.viet.myappdemo.VideoActivity.getFrame(VideoActivity.java:283)
        at com.example.viet.myappdemo.VideoActivity.access$100(VideoActivity.java:43)
        at com.example.viet.myappdemo.VideoActivity$2.run(VideoActivity.java:245)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:148)
        at android.app.ActivityThread.main(ActivityThread.java:5417)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

What I've done so far:

  • Download your JavaCV 1.1 binary archive javacv-1.1-bin.zip
  • Extract it and put ffmpeg.jar, javacpp.jar, javacv.jar under libs folder in my Android project.
  • Add them as dependency for my app module.

When I try to replace ffmpeg.jar with ffmpeg-android-arm.jar as my Nexus 5 using an armv7 architect, I get this error:

FATAL EXCEPTION: main
    Process: com.example.viet.myappdemo, PID: 23842
    java.lang.NoClassDefFoundError: Failed resolution of: Lorg/bytedeco/javacpp/avcodec;
        at org.bytedeco.javacv.FFmpegFrameGrabber.release(FFmpegFrameGrabber.java:124)
        at org.bytedeco.javacv.FFmpegFrameGrabber.stop(FFmpegFrameGrabber.java:551)
        at com.example.viet.myappdemo.VideoActivity.getFrame(VideoActivity.java:295)
        at com.example.viet.myappdemo.VideoActivity.access$100(VideoActivity.java:43)
        at com.example.viet.myappdemo.VideoActivity$2.run(VideoActivity.java:245)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:148)
        at android.app.ActivityThread.main(ActivityThread.java:5417)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
     Caused by: java.lang.ClassNotFoundException: Didn't find class "org.bytedeco.javacpp.avcodec" on path: DexPathList[[zip file "/data/app/com.example.viet.myappdemo-2/base.apk"],nativeLibraryDirectories=[/data/app/com.example.viet.myappdemo-2/lib/arm, /data/app/com.example.viet.myappdemo-2/base.apk!/lib/armeabi, /vendor/lib, /system/lib]]
        at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
        at org.bytedeco.javacv.FFmpegFrameGrabber.release(FFmpegFrameGrabber.java:124) 
        at org.bytedeco.javacv.FFmpegFrameGrabber.stop(FFmpegFrameGrabber.java:551) 
        at com.example.viet.myappdemo.VideoActivity.getFrame(VideoActivity.java:295) 
        at com.example.viet.myappdemo.VideoActivity.access$100(VideoActivity.java:43) 
        at com.example.viet.myappdemo.VideoActivity$2.run(VideoActivity.java:245) 
        at android.os.Handler.handleCallback(Handler.java:739) 
        at android.os.Handler.dispatchMessage(Handler.java:95) 
        at android.os.Looper.loop(Looper.java:148) 
        at android.app.ActivityThread.main(ActivityThread.java:5417) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
        Suppressed: java.lang.ClassNotFoundException: org.bytedeco.javacpp.avcodec
        at java.lang.Class.classForName(Native Method)
        at java.lang.BootClassLoader.findClass(ClassLoader.java:781)
        at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
                ... 13 more
     Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack trace available

I've tried to download these files:

  • ffmpeg-3.0-1.2-20160319.155429-3.jar
  • ffmpeg-3.0-1.2-20160319.155429-3-android-arm.jar
  • ffmpeg-3.0-1.2-20160319.155429-3-android-x86.jar
  • javacpp-1.2-20160402.142645-6.jar
  • javacv-1.2-20160319.154745-3.jar

but the same issue happens. I've also tried to change targetSdkVersion 22 but it doesn't work.
I also do not have armeabi (or armeabi-v7a) folder in my project so maybe all the necessary .so files don't get copied into my project?
Am I missing something obvious here?

@saudet
Copy link
Member

saudet commented Apr 4, 2016

Are you sure this isn't an issue related to ProGuard?
https://github.com/bytedeco/javacv/wiki/Configuring-Proguard-for-JavaCV

@vxhviet
Copy link
Author

vxhviet commented Apr 5, 2016

Hi @saudet, my Android Studio do indeed comes with proguard version 4.7. I've followed the instruction in your provided link, however I still get the java.lang.UnsatisfiedLinkError.

I'm trying to follow the instruction in one of your suggestion to use ReLinker. The step is not very clear though. Should I put all the relevant jar file (ffmpeg-android-arm.jar, ffmpeg-android-x86.jar, javacpp.jar, javacv.jar) in the libs folder and make a call like:
ReLinker.loadLibrary(context, “ffmpeg-android-arm.jar”)

I've tried it but it didn't work. Is there away to make it work with gradle instead?

@saudet
Copy link
Member

saudet commented Apr 5, 2016

Sure, it works with Gradle, see #133, for example, but there are also unresolved issues with that. I guess I'll just mark this as a duplicate of that issue actually. Please continue the discussion there. Thanks!

@saudet saudet closed this as completed Apr 5, 2016
@vxhviet
Copy link
Author

vxhviet commented Apr 5, 2016

Sorry, I didn't realize saudet closed my issue just minutes before my submit so I'll just continue there instead.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants