如何在包含本机库时更改包名称

时间:2013-09-30 23:52:38

标签: android android-ndk

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

我下载了代码,并且能够在手机上成功运行。我做了几处更改,然后在几台设备上再次测试,一切正常。今晚我尝试将包名从“ffvideolivewallpaper.frankandrobot.com”更改为“com.nightscapecreations.orionkeysfree”。我在java,c和xml文件中进行了搜索和替换以替换它们。我还修改了c文件,用“Java_com_nightscapecreations_orionkeysfree_NativeCalls”替换“Java_ffvideolivewallpaper_frankandrobot_com_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将无法正确编译。

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

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:0)

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