Как вы можете динамически загрузить активность или класс Android из внешнего файла JAR? - PullRequest
1 голос
/ 09 ноября 2011

этот вопрос на самом деле состоит из нескольких частей:

  1. как создать внешний файл JAR, который может быть загружен динамически?Вы можете просто загрузить файл .apk как файл .jar?вы можете вместо этого загрузить classes.dex?Вам нужно использовать инструмент dx для преобразования jar-файла, чтобы сделать это?

  2. Я вижу этот фрагмент кода для динамической загрузки класса:

        String jarfile = "test2.jar";
        DexClassLoader classloader = new DexClassLoader(
            jarfile, "/tmp", null, getClass().getClassLoader());
        Class<?> myclass = classloader.loadClass("Test2Activity");
    

В таком случае, где находится файл jar?Другими словами, при установке моего основного приложения для Android мне понадобится путь к файлу test2.jar.

спасибо за любую помощь.

Ответы [ 2 ]

0 голосов
/ 29 августа 2012

Я на самом деле ищу аналогичный ответ - Мне удалось найти способ динамической загрузки файлов JAR в приложение для Android - прямо здесь, на переполнение стека по этой ссылке: -Все, что вам нужно, здесь - за исключением того, что я добавил некоторые вещи, которые потратил время, пытаясь выяснить ниже ссылки, - которые могут быть полезны для вас

http://stackoverflow.com/questions/11453614/how-can-i-load-a-jar-file-dynamically-in-an-android-application-4-0-3

Вот некоторые вещи, которые следует иметь в виду:

  1. При создании .jar: вам нужен только файл .class, который необходимо динамически загружать - вам не нужно включать интерфейс IPeripheral в файл .jar.

  2. Создайте файл .jar с помощью IDE - я бы не использовал следующую команду для редактирования файла манифеста по умолчанию, вызванного с помощью параметра jar в командной строке - например, так: "jar cmf manifest-extension jar- file input-file (s) ". Вместо этого откройте eclipse, выберите «Файл»> «Экспорт»> «Java»> «Jar File» и следуйте по нему.

  3. Когда дело доходит до выбора файла манифеста - выберите настроенный, и просто создайте файл манифеста в проекте в виде текстового файла с именем без названия и сохраните его как Whothing.manifest. Убедитесь, что в конце этого текстового файла одна пустая строка файла!

  4. В примере кода по ссылке выше: убедитесь, что дважды проверили, что на самом деле делает эта строка:

    dalvik.system.PathClassLoader myClassLoader = new dalvik.system.PathClassLoader(urls.get(index).toString(), ModuleLoader.class.getClassLoader());
    

Причина, по которой я это говорю, заключается в том, что urls.get (index) .toString () вернет file: / pathname, а вам просто нужно указать имя пути. Я просто разобрал это, чтобы все заработало.

  1. Чтобы создать SDCard - просто сделайте это из диспетчера устройств Android - Есть возможность установить внешнее хранилище - выберите размер. В DDMS вы сможете открыть «Проводник», вы найдете sdcard в папке mnt и сможете вставить файл jar в папку sd card.

  2. Вот так выглядит мой класс Main_activity, который вызывает загрузчик модулей.

    public class MainActivity extends Activity 
    {
        private static Context context;
        @Override
        public void onCreate(Bundle savedInstanceState) 
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            //Get this classes context
            MainActivity.context = getApplicationContext();
    
            // method to return a list of modules that all implement the interface IPeripheral 
            List<IPeripheral> modules = ModuleLoader.loadModules("/mnt/sdcard", getApplicationContext());
    
            //Accessing a method - and display is just a method that toasts.
            display(modules.get(0).getName());
        }
    }
    

    Надеюсь, это поможет - я не думаю, что вы можете динамически добавлять файлы JAR, которые являются файлами Java, которые на самом деле являются "экранами" или действиями Android, так как это потребует от вас программного редактирования файла манифеста Projects Android. что вы пытаетесь динамически загрузить банку в. Я не думаю, что это будет возможно, так как это создает угрозу безопасности.

0 голосов
/ 09 ноября 2011

Я не думаю, что это возможно, по крайней мере, ссылка на каждое действие, которое вы можете инициировать, должна существовать в манифесте вашего проекта. Так что даже если бы это было возможно, я думаю, что все равно не получится. Вы пытались изучить Настройка библиотечного проекта в качестве альтернативы?

...