在Android中嵌入Knopflerfish不会';行不通

在Android中嵌入Knopflerfish不会';行不通,android,osgi,knopflerfish,Android,Osgi,Knopflerfish,我正在尝试将Knopflerfish框架嵌入到android应用程序中,以便动态加载和卸载捆绑包。我遵循了教程 我做的第一步是从E链接下载framework.jar,并将其添加到eclipse项目中的类路径中 此外,下面是我的onCreate()方法: 注意,我更改了一行代码,因为它显示了语法错误 即: Dictionary fwprops = new Hashtable(); to Map fwprops = new Hashtable(); //CHANGED 语法错误:类型Framewo

我正在尝试将Knopflerfish框架嵌入到android应用程序中,以便动态加载和卸载捆绑包。我遵循了教程

我做的第一步是从E链接下载framework.jar,并将其添加到eclipse项目中的类路径中

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

注意,我更改了一行代码,因为它显示了语法错误

即:

Dictionary fwprops = new Hashtable();
to
Map fwprops = new Hashtable(); //CHANGED
语法错误:
类型FrameworkFactory中的方法newFramework(Map)不适用于参数(字典)

现在,根据帖子中的@ldx,“我为Knopflerfish提供更好的Android/Dalvik支持而提交的补丁已经被合并,因此补丁和重新编译KF应该不再需要了:”

因此,假设我的代码已经足够了,我没有添加任何内容

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

有人能帮忙吗?以下是日志:

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
08-04 18:25:35.233:E/Trace(7018):打开跟踪文件时出错:没有这样的文件或目录(2)
08-04 18:25:36.793:D/AndroidRuntime(7018):关闭虚拟机
08-04 18:25:36.793:W/dalvikvm(7018):threadid=1:线程以未捕获异常退出(组=0x40a71930)
08-04 18:25:36.813:E/AndroidRuntime(7018):致命异常:主
08-04 18:25:36.813:E/AndroidRuntime(7018):java.lang.RuntimeException:无法启动活动组件信息{com.example.knopflerfish_android/com.example.knopflerfish_android.MainActivity}:java.lang.RuntimeException:未能初始化存储org.knopflerfish.framework.bundlestreage.file.bundlestragpl
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.Invokenactive(本机方法)
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)
8-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.bundlestrage.file.bundlestrageimpl.(bundlestrageimpl.java:127)
08-04 18:25:36.813:E/AndroidRuntime(7018):。。。20多
08-04 18:25:39.543:I/进程(7018):发送信号。PID:7018信号:9

在注释
//向fwprops添加任何框架属性,
我只需要添加框架启动属性,指定框架使用的持久存储目录。由于它是Android,存储目录的默认值似乎不起作用。相反,我应该在
sdcard
下指定目录。因此,我添加了这一行:

 fwprops.put("org.osgi.framework.storage", "sdcard/fwdir");
以下是我的更新代码:

@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());

        }

    }  
@覆盖
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Map fwprops=new Hashtable();//已更改
//向fwprops添加任何框架属性
put(“org.osgi.framework.storage”,“sdcard/fwdir”);
FrameworkFactory ff=新的FrameworkFactoryImpl();
mframew=ff.newFramework(fwprops);
@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());

        }

    }