2013-08-03 64 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