嵌入Knopflerfish在Android不工作工作、Knopflerfish、Android

2023-09-06 04:58:02 作者:占心为王

我试图嵌入Knopflerfish框架变成一个Android应用程序加载和动态卸载捆绑。我跟着本教程

我做的第一步是下载framework.jar弗罗姆这个环节,并把它添加到我的类路径在我的Eclipse项目。

此外,下面是我的onCreate()方法:

  @覆盖
保护无效的onCreate(包savedInstanceState){
    super.onCreate(savedInstanceState);
    的setContentView(R.layout.activity_main);



    地图fwprops =新的Hashtable(); // CHANGED
    //添加任何框架属性fwprops
    FrameworkFactory FF =新FrameworkFactoryImpl();
    mFramework = ff.newFramework(fwprops);
    尝试 {

        mFramework.init(); //错误在这里!

    }赶上(BundleException定){
        //框架初始化失败

        Log.d(TAG,be.getStackTrace()的toString());
    }



}
 

请注意,我改变了一行的code,因为它显示了一个语法错误。

这就是:

 词典fwprops =新的Hashtable();
至
地图fwprops =新的Hashtable(); // CHANGED
 
Fishing Panda 游戏正式登陆谷歌电子市场 Android Market

语法错误:在类型FrameworkFactory的方法newFramework(图)不适用于参数(字典)

现在,根据@ldx在this后,我在Knopflerfish提交更好的Andr​​oid / Dalvik的支持,该补丁已经被合并,以便修补和重新编译KF应该没有必要了:

因此​​我假设我code是足够的,因为它现在是不添加任何东西。

当我运行的应用程序。我立即得到:不幸的是,Knopflerfish_Android已停止在屏幕上

有人能帮助?下面是LogCat中:

  08-04 18:25:35.233:E /跟踪(7018):错误打开跟踪文件:没有这样的文件或目录(2)
08-04 18:25:36.793:D / AndroidRuntime(7018):关闭虚拟机
08-04 18:25:36.793:W / dalvikvm(7018):主题ID = 1:螺纹退出与未捕获的异常(组= 0x40a71930)
08-04 18:25:36.813:E / AndroidRuntime(7018):致命异常:主要
08-04 18:25:36.813:E / AndroidRuntime(7018):java.lang.RuntimeException的:无法启动的活动ComponentInfo {com.example.knopflerfish_android / com.example.knopflerfish_android.MainActivity}:java.lang.RuntimeException的:失败初始化存储org.knopflerfish.framework.bundlestorage.file.BundleStorageImpl
08-04 18:25:36.813:E / AndroidRuntime(7018):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
08-04 18:25:36.813:E / AndroidRuntime(7018):在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
08-04 18:25:36.813:E / AndroidRuntime(7018):在android.app.ActivityThread.access $ 600(ActivityThread.java:141)
08-04 18:25:36.813:E / AndroidRuntime(7018):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1234)
08-04 18:25:36.813:E / AndroidRuntime(7018):在android.os.Handler.dispatchMessage(Handler.java:99)
08-04 18:25:36.813:E / AndroidRuntime(7018):在android.os.Looper.loop(Looper.java:137)
08-04 18:25:36.813:E / AndroidRuntime(7018):在android.app.ActivityThread.main(ActivityThread.java:5041)
08-04 18:25:36.813:E / AndroidRuntime(7018):在java.lang.reflect.Method.invokeNative(本机方法)
08-04 18:25:36.813:E / AndroidRuntime(7018):在java.lang.reflect.Method.invoke(Method.java:511)
08-04 18:25:36.813:E / AndroidRuntime(7018):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:793)
08-04 18:25:36.813:E / AndroidRuntime(7018):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
08-04 18:25:36.813:E / AndroidRuntime(7018):在dalvik.system.NativeStart.main(本机方法)
08-04 18:25:36.813:E / AndroidRuntime(7018):java.lang.RuntimeException的:产生的原因无法初始化存储org.knopflerfish.framework.bundlestorage.file.BundleStorageImpl
08-04 18:25:36.813:E / AndroidRuntime(7018):在org.knopflerfish.framework.FrameworkContext.init(FrameworkContext.java:343)
08-04 18:25:36.813:E / AndroidRuntime(7018):在org.knopflerfish.framework.SystemBundle.doInit(SystemBundle.java:513)
08-04 18:25:36.813:E / AndroidRuntime(7018):在org.knopflerfish.framework.SystemBundle.init(SystemBundle.java:125)
08-04 18:25:36.813:E / AndroidRuntime(7018):在com.example.knopflerfish_android.MainActivity.onCreate(MainActivity.java:39)
08-04 18:25:36.813:E / AndroidRuntime(7018):在android.app.Activity.performCreate(Activity.java:5104)
08-04 18:25:36.813:E / AndroidRuntime(7018):在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
08-04 18:25:36.813:E / AndroidRuntime(7018):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
08-04 18:25:36.813:E / AndroidRuntime(7018):11 ...更多
08-04 18:25:36.813:E / AndroidRuntime(7018):由:java.lang.reflect.InvocationTargetException
08-04 18:25:36.813:E / AndroidRuntime(7018):在java.lang.reflect.Constructor.constructNative(本机方法)
08-04 18:25:36.813:E / AndroidRuntime(7018):在java.lang.reflect.Constructor.newInstance(Constructor.java:417)
08-04 18:25:36.813:E / AndroidRuntime(7018):在org.knopflerfish.framework.FrameworkContext.init(FrameworkContext.java:341)
08-04 18:25:36.813:E / AndroidRuntime(7018):17 ...更多
08-04 18:25:36.813:E / AndroidRuntime(7018):由:java.lang.RuntimeException的:无法创建目录:/ FWDIR / BS
08-04 18:25:36.813:E / AndroidRuntime(7018):在org.knopflerfish.framework.Util.getFileStorage(Util.java:99)
08-04 18:25:36.813:E / AndroidRuntime(7018):在org.knopflerfish.framework.bundlestorage.file.BundleStorageImpl.<init>(BundleStorageImpl.java:127)
08-04 18:25:36.813:E / AndroidRuntime(7018):20 ...更多
08-04 18:25:39.543:I /过程(7018):发送信号。 PID:7018 SIG:9
 

解决方案

在注释 //添加任何框架属性fwprops , 我只需要添加框架开展财产指定使用的框架持久存储目录。既然是机器人,用于存放目录的缺省值似乎并没有工作。相反,我要说明下目录SD卡。因此,我说这行:

  fwprops.put(org.osgi.framework.storage,SD卡/ FWDIR);
 

下面是我更新code:

  @覆盖
    保护无效的onCreate(包savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.activity_main);

        地图&LT;字符串,字符串&GT; fwprops =新的Hashtable&LT;字符串,字符串&GT;(); // CHANGED

        //添加任何框架属性fwprops
        fwprops.put(org.osgi.framework.storage,SD卡/ FWDIR);

        FrameworkFactory FF =新FrameworkFactoryImpl();
        mFramework = ff.newFramework(fwprops);

        尝试 {

            mFramework.init(); //这个现在的工作:P:P

        }赶上(BundleException定){
            //框架初始化失败

            Log.d(TAG,be.getStackTrace()的toString());

        }

    }
 

由于这两个环节: 的http://www.osgi.org/javadoc/r4v43/core/org/osgi/framework/Constants.html#FRAMEWORK_STORAGE http://www.knopflerfish.org/releases/current/docs/bundledoc/index.html?docpage=framework/index.html

I am trying to embed the Knopflerfish framework into an android application to load and unload bundles dynamically. I followed this tutorial

The first step I did is to download framework.jar frome this link, and to add it to my class path in my eclipse project.

Additionally, below is my onCreate() method:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);



    Map fwprops = new Hashtable(); //CHANGED
    // add any framework properties to fwprops
    FrameworkFactory ff = new FrameworkFactoryImpl();
    mFramework = ff.newFramework(fwprops);
    try {

        mFramework.init(); //ERROR HERE!!

    } catch (BundleException be) {
        // framework initialization failed

        Log.d(TAG, be.getStackTrace().toString());
    }



}

Note that I changed one line of the code, because it shows a syntax error.

Which is:

Dictionary fwprops = new Hashtable();
to
Map fwprops = new Hashtable(); //CHANGED

The Syntax Error: The method newFramework(Map) in the type FrameworkFactory is not applicable for the arguments (Dictionary)

Now, According to @ldx in this post, "The patches I submitted for better Android/Dalvik support in Knopflerfish have been merged so patching and recompiling KF should not be necessary anymore:"

and therefore I didn't add anything assuming my code is enough as it is now.

When I run the app. I instantly get: Unfortunately, Knopflerfish_Android has stopped on the screen.

Can someone help? Below is the LogCat:

08-04 18:25:35.233: E/Trace(7018): error opening trace file: No such file or directory (2)
08-04 18:25:36.793: D/AndroidRuntime(7018): Shutting down VM
08-04 18:25:36.793: W/dalvikvm(7018): threadid=1: thread exiting with uncaught exception (group=0x40a71930)
08-04 18:25:36.813: E/AndroidRuntime(7018): FATAL EXCEPTION: main
08-04 18:25:36.813: E/AndroidRuntime(7018): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.knopflerfish_android/com.example.knopflerfish_android.MainActivity}: java.lang.RuntimeException: Failed to initialize storage org.knopflerfish.framework.bundlestorage.file.BundleStorageImpl
08-04 18:25:36.813: E/AndroidRuntime(7018):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
08-04 18:25:36.813: E/AndroidRuntime(7018):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
08-04 18:25:36.813: E/AndroidRuntime(7018):     at android.app.ActivityThread.access$600(ActivityThread.java:141)
08-04 18:25:36.813: E/AndroidRuntime(7018):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
08-04 18:25:36.813: E/AndroidRuntime(7018):     at android.os.Handler.dispatchMessage(Handler.java:99)
08-04 18:25:36.813: E/AndroidRuntime(7018):     at android.os.Looper.loop(Looper.java:137)
08-04 18:25:36.813: E/AndroidRuntime(7018):     at android.app.ActivityThread.main(ActivityThread.java:5041)
08-04 18:25:36.813: E/AndroidRuntime(7018):     at java.lang.reflect.Method.invokeNative(Native Method)
08-04 18:25:36.813: E/AndroidRuntime(7018):     at java.lang.reflect.Method.invoke(Method.java:511)
08-04 18:25:36.813: E/AndroidRuntime(7018):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
08-04 18:25:36.813: E/AndroidRuntime(7018):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
08-04 18:25:36.813: E/AndroidRuntime(7018):     at dalvik.system.NativeStart.main(Native Method)
08-04 18:25:36.813: E/AndroidRuntime(7018): Caused by: java.lang.RuntimeException: Failed to initialize storage org.knopflerfish.framework.bundlestorage.file.BundleStorageImpl
08-04 18:25:36.813: E/AndroidRuntime(7018):     at org.knopflerfish.framework.FrameworkContext.init(FrameworkContext.java:343)
08-04 18:25:36.813: E/AndroidRuntime(7018):     at org.knopflerfish.framework.SystemBundle.doInit(SystemBundle.java:513)
08-04 18:25:36.813: E/AndroidRuntime(7018):     at org.knopflerfish.framework.SystemBundle.init(SystemBundle.java:125)
08-04 18:25:36.813: E/AndroidRuntime(7018):     at com.example.knopflerfish_android.MainActivity.onCreate(MainActivity.java:39)
08-04 18:25:36.813: E/AndroidRuntime(7018):     at android.app.Activity.performCreate(Activity.java:5104)
08-04 18:25:36.813: E/AndroidRuntime(7018):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
08-04 18:25:36.813: E/AndroidRuntime(7018):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
08-04 18:25:36.813: E/AndroidRuntime(7018):     ... 11 more
08-04 18:25:36.813: E/AndroidRuntime(7018): Caused by: java.lang.reflect.InvocationTargetException
08-04 18:25:36.813: E/AndroidRuntime(7018):     at java.lang.reflect.Constructor.constructNative(Native Method)
08-04 18:25:36.813: E/AndroidRuntime(7018):     at java.lang.reflect.Constructor.newInstance(Constructor.java:417)
08-04 18:25:36.813: E/AndroidRuntime(7018):     at org.knopflerfish.framework.FrameworkContext.init(FrameworkContext.java:341)
08-04 18:25:36.813: E/AndroidRuntime(7018):     ... 17 more
08-04 18:25:36.813: E/AndroidRuntime(7018): Caused by: java.lang.RuntimeException: Cannot create directory: /fwdir/bs
08-04 18:25:36.813: E/AndroidRuntime(7018):     at org.knopflerfish.framework.Util.getFileStorage(Util.java:99)
08-04 18:25:36.813: E/AndroidRuntime(7018):     at org.knopflerfish.framework.bundlestorage.file.BundleStorageImpl.<init>(BundleStorageImpl.java:127)
08-04 18:25:36.813: E/AndroidRuntime(7018):     ... 20 more
08-04 18:25:39.543: I/Process(7018): Sending signal. PID: 7018 SIG: 9

解决方案

At the comment // add any framework properties to fwprops, I only had to add the Framework launching property specifying the persistent storage directory used by the framework. Since it is Android, the default value for the storage directory doesn't seem to work. Instead, I should specify the directory under sdcard. Hence, I added this line:

 fwprops.put("org.osgi.framework.storage", "sdcard/fwdir");

Below is my updated code:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Map<String, String> fwprops = new Hashtable<String, String>(); //CHANGED

        // add any framework properties to fwprops
        fwprops.put("org.osgi.framework.storage", "sdcard/fwdir");

        FrameworkFactory ff = new FrameworkFactoryImpl();
        mFramework = ff.newFramework(fwprops);

        try {

            mFramework.init(); //THIS WORKS NOW :P :P

        } catch (BundleException be) {
            // framework initialization failed

            Log.d(TAG, be.getStackTrace().toString());

        }

    }  

Thanks to these two links: http://www.osgi.org/javadoc/r4v43/core/org/osgi/framework/Constants.html#FRAMEWORK_STORAGE http://www.knopflerfish.org/releases/current/docs/bundledoc/index.html?docpage=framework/index.html

 
精彩推荐
图片推荐