2013-08-03 39 views
2

我试图将Knopflerfish框架嵌入到android应用程序中以动态加载和卸载包。我跟着this教程在Android中嵌入Knopflerfish不起作用

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

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

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



} 

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

那就是:

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

语法错误:The method newFramework(Map) in the type FrameworkFactory is not applicable for the arguments (Dictionary)

现在,根据@ldx在this后,“我在Knopflerfish提交了更好的Android/Dalvik的支持,这些修补程序已合并,使修补和重新编译KF不再是必要的:“

因此,我没有添加任何东西,假设我的代码已经足够,因为它是现在。

当我运行该应用程序。我立即得到:屏幕上的Unfortunately, Knopflerfish_Android has stopped

有人可以帮忙吗?下面是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 

回答

1

在评论// add any framework properties to 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()); 

     } 

    } 

由于这两个环节: 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