@gibbonchik

Как динамически использовать jar?

Имеется простая библиотека .jar, в ней один класс com.example.myclass:
package com.example;

public class myclass
{
  public int Summ(int a, int b)
  {
    return a + b;
  }
}

и манифест:
Manifest-Version: 1.0
Main-Class: com.example.myclass

69901fa94b8948db911a9f9c2f7a5089.png
Из своего приложения для Android я пытаюсь вызвать функцию "summ" следующим кодом:
String dexPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getPath() + "/lib.jar";
        String dexOutputDir = getApplicationInfo().dataDir;
        DexClassLoader pathClassLoader = new DexClassLoader(dexPath, dexOutputDir, null, this
                .getClass().getClassLoader());
        try {
            Class<?> class1 = pathClassLoader.loadClass("com.example.myclass");
            Object object = class1.newInstance();
            Class[] params = new Class[2];
            params[0] = Integer.TYPE;
            params[1] = Integer.TYPE;
            Method action = class1.getMethod("Summ", params);
            Integer ret = (Integer) action.invoke(object, 12, 13);
            tv.setText("method : " + action.getName() + ", return :" + ret);
        } catch (Exception e) {
            tv.setText("error : " + e.getMessage());
        }

Но возникает ошибка "Didn't find class".

Подскажите, пожалуйста, может у меня неправильная структура jar файла или я неверно вызываю метод.
  • Вопрос задан
  • 301 просмотр
Решения вопроса 1
@gibbonchik Автор вопроса
Нашел решение:
File f = new File("/sdcard/MyFavorite/mygame.jar");
DexClassLoader u = new DexClassLoader(f.toURI().toURL().toString(), getDir("libs", MODE_PRIVATE).getAbsolutePath(), null, ClassLoader.getSystemClassLoader());
Class c = u.loadClass("com.example.myclass");
Object object = c.newInstance();
Class[] params = new Class[2];
params[0] = Integer.TYPE;
params[1] = Integer.TYPE;
Method action = c.getMethod("Summ", params);
Integer ret = (Integer) action.invoke(object, 12, 13);
Log.d("DEBUG","method : " + action.getName() + ", return :" + ret);

, но немного меняем сам .jar файл. вместо классов (com/example/myclass.class) необходимо положить один classes.dex файл.
Создается он следующей командой:
dx.bat --dex --verbose --output .\libgame\classes.dex .\libgame
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы