Встраивание Knopflerfish в Android не работает

Я пытаюсь встроить среду Knopflerfish в приложение для Android, чтобы динамически загружать и выгружать пакеты. Я следовал этому уроку

Первый шаг, который я сделал, это скачал framework.jar из этой ссылки и добавил ее в мой путь к классам в моем проекте 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 в этом посте, "исправления, которые я отправил для лучшей поддержки Android/Dalvik в Knopflerfish, были объединены, поэтому исправление и перекомпиляция 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Мне нужно было только добавить свойство запуска Framework, определяющее каталог постоянного хранилища, используемый платформой. Поскольку это 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 http://www.knopflerfish.org/releases/current/docs/bundledoc/index.html?docpage=framework/index.html

Другие вопросы по тегам