0

我有一个基于http://ikaruga2.wordpress.com/2011/08/10/video-live-wallpaper-part-4/上的精彩代码的 Android 项目。本质上,这个应用程序是一个动态壁纸,它使用 FFMpeg 逐帧读取视频文件并使用 GLWallpaperService 将其播放到屏幕上。

我下载了代码,并能够让它在我的手机上成功运行。我做了几处更改,然后在几台设备上再次测试,一切正常。今天晚上,我尝试将包名称从“ffvideolivewallpaper.frankandrobot.com”更改为“com.nightscapecreations.orionkeysfree”。我在 java、c 和 xml 文件中进行了搜索和替换以替换它们。我还修改了 c 文件,将“Java_ffvideolivewallpaper_frankandrobot_com_NativeCalls”替换为“Java_com_nightscapecreations_orionkeysfree_NativeCalls”。但是,当我现在在手机上运行该应用程序时,我收到此错误:

09-30 12:53:44.911: E/AndroidRuntime(24237):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:590)
09-30 12:53:44.911: E/AndroidRuntime(24237):     at dalvik.system.NativeStart.main(Native Method)
09-30 12:53:44.911: E/AndroidRuntime(24237): Caused by: java.lang.UnsatisfiedLinkError: Cannot load library: link_image[1936]:   145 could not load needed library '/data/data/ffvideolivewallpaper.frankandrobot.com/lib/libavutil.so' for 'libavcore.so' (load_library[1091]: Library '/data/data/ffvideolivewallpaper.frankandrobot.com/lib/libavutil.so' not found)
09-30 12:53:44.911: E/AndroidRuntime(24237):     at java.lang.Runtime.loadLibrary(Runtime.java:370)
09-30 12:53:44.911: E/AndroidRuntime(24237):     at java.lang.System.loadLibrary(System.java:535)
09-30 12:53:44.911: E/AndroidRuntime(24237):     at com.nightscapecreations.orionkeysfree.NativeCalls.<clinit>(NativeCalls.java:64)
09-30 12:53:44.911: E/AndroidRuntime(24237):     ... 13 more

我假设在某处缺少对旧包名称的引用,但我无法通过 Eclipse 的文件搜索找到任何内容。Eclipse 正在为我管理 NDK 并编译所有库和 c 代码。到目前为止,我已经尝试过:

  • 进行干净的构建
  • 重启 Eclipse
  • 删除 libs 目录中的所有内容并再次构建

出错的本机调用文件如下所示:

package com.nightscapecreations.orionkeysfree;

public class NativeCalls {
    //ffmpeg
    public static native void initVideo();
    public static native void loadVideo(String fileName); //
    public static native void prepareStorageFrame();
    public static native void getFrame(); //
    public static native void freeConversionStorage();
    public static native void closeVideo();//
    public static native void freeVideo();//
    //opengl
    public static native void initPreOpenGL(); //
    public static native void initOpenGL(); //
    public static native void drawFrame(); //
    public static native void closeOpenGL(); //
    public static native void closePostOpenGL();//
    //wallpaper
    public static native void updateVideoPosition();
    public static native void setSpanVideo(boolean b);
    //getters
    public static native int getVideoHeight();
    public static native int getVideoWidth();
    //setters
    public static native void setWallVideoDimensions(int w,int h);
    public static native void setWallDimensions(int w,int h);
    public static native void setScreenPadding(int w,int h);
    public static native void setVideoMargins(int w,int h);
    public static native void setDrawDimensions(int drawWidth,int drawHeight);
    public static native void setOffsets(int x,int y);
    public static native void setSteps(int xs,int ys);
    public static native void setScreenDimensions(int w, int h);
    public static native void setTextureDimensions(int tx,
                           int ty );
    public static native void setOrientation(boolean b);
    public static native void setPreviewMode(boolean b);
    public static native void setTonality(int t);
    public static native void toggleGetFrame(boolean b);
    //fps
    public static native void setLoopVideo(boolean b);

    static {
    System.loadLibrary("avcore");
    System.loadLibrary("avformat");
    System.loadLibrary("avcodec");
    //System.loadLibrary("avdevice");
    System.loadLibrary("avfilter");
    System.loadLibrary("avutil");
    System.loadLibrary("swscale");
    System.loadLibrary("video");
    }

}

如何解决此错误?更改包名称时还需要做什么?我将来需要多次这样做。



编辑:

看来我找错地方了。原版代码的开发者指出,编译ffmpeg库时有传入包名。他很好地用我的包名为我编译了一个新版本,并且壁纸工作得很好。我们尝试了不带包名的编译,但是当添加到应用程序时,它只是导致:

 10-04 08:20:57.414: E/AndroidRuntime(19139): Caused by: java.lang.UnsatisfiedLinkError: Cannot load library: link_image[1936]:   145 could not load needed library 'libavutil.so' for 'libavcore.so' (load_library[1091]: Library 'libavutil.so' not found)

我猜我每次制作新壁纸时只需要编译一个新版本。对于那些试图做同样事情的人,我想指出,这个项目中使用的 ffmpeg 版本需要 ndk 版本 5;版本 9 将无法正确编译它。

我已经接受了现有答案,而不是添加我自己的答案,因为它确实回答了我问题的初衷,即使它没有解决这个特定问题,我认为它可能对其他新开发人员有所帮助。

4

2 回答 2

5

如果使用 Eclipse,重命名包的正确方法是执行以下操作:右键单击项目 -> Android 工具 -> 重命名应用程序包。

于 2013-10-01T01:10:56.810 回答
0

最简单的更改是不将 NativeCalls 类移动到新包中。这可能会导致使用此类的 Java 文件中的语句很少import,但您的 C 代码可以保持不变。您甚至可以在不重新编译的情况下使用它。

于 2013-10-01T03:55:05.723 回答