我有一个基于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 将无法正确编译它。
我已经接受了现有答案,而不是添加我自己的答案,因为它确实回答了我问题的初衷,即使它没有解决这个特定问题,我认为它可能对其他新开发人员有所帮助。