Java android:在导入

时间:2018-05-31 09:01:33

标签: java android shared-libraries dalvik dex

我正在开发Android应用程序(在Android工作室下),允许用户在运行时运行“Java android”代码。

我的第一项研究帮助我从“MyClass.java”创建一个库,Android应用程序可以理解。

  1. 使用命令“Javac”从“MyClass.java”创建“MyClass.class”
  2.   

    C:\ Program Files \ Android \ Android Studio \ jre \ bin \ javac -source 1.8   -target 1.8 -d“./” - classpath“C:\ Users \ user_account \ AppData \ Local \ Android \ Sdk \ platforms \ android-27 \ android.jar”   -bootclasspath“C:\ Program Files \ Android \ Android Studio \ jre \ jre \ lib \ rt.jar”“MyClass.java”

    1. 使用“Jar”命令
    2. 将此“MyClass.class”转换为Jar库
        

      C:\ Program Files \ Android \ Android Studio \ jre \ bin \ jar cvf“MyClass.jar”com / YourPackage / MyClass.class

      1. 最后用“dx”工具将其翻译成Dalvik系统
      2.   

        调用C:\ Users \ user_account \ AppData \ Local \ Android \ Sdk \ build-tools \ 27.0.3 \ dx --dex --output“MyClass.dex”“MyClass.jar”

        在Android应用程序中,我可以通过以下方式调用库中的方法:

        final String libPath = Environment.getExternalStorageDirectory() + "/DexFile/MyClass.dex";
        final File tmpDir = getDir("DexFile", 0);
        DexClassLoader classloader = new DexClassLoader(libPath, tmpDir.getAbsolutePath(), null, this.getClass().getClassLoader());
        classToLoad = (Class<?>) classloader.loadClass("com.YourPackage.MyClass");
        
        Object myInstance = classToLoad.newInstance();
        Method mainMethod= classToLoad.getMethod("main");
        mainMethod.invoke(myInstance);
        

        一些棘手的事情,如果您不在主要部分添加一些权限,则此代码不起作用:

         /**
         * Checks if the app has permission to write to device storage
         * <p>
         * If the app does not has permission then the user will be prompted to grant permissions
         *
         * @param activity
         */
        public static void verifyStoragePermissions(Activity activity) {
            // Check if we have write permission
            int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE);
        
            if (permission != PackageManager.PERMISSION_GRANTED) {
                // We don't have permission so prompt the user
                ActivityCompat.requestPermissions(
                        activity,
                        PERMISSIONS_STORAGE,
                        REQUEST_EXTERNAL_STORAGE
                );
            }
        }
        

        在你的清单中:

             <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
             <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
        

        此时我可以调用自定义库中的方法。但现在我需要从库中调用我的主要活动的方法。简化我的问题是:

        Diagram of my problem

        第一个问题,我需要的是从库中看到的异常视图,我想附加并在我的库和我的应用程序之间建立依赖关系。因此,我没有找到任何可以帮助我的东西。 我带来的唯一想法是将一个对象参数传递给我的“main()”并在该对象中调用一个方法,但这不起作用:

        package com.YourPackage;
        public class MyClass{
            public void main(Object object){
                try{
                    Class cls = obj.getClass();
                    Method mainMethod = cls.getMethod("methodToCall",null);
                    mainMethod.invoke(obj,null);
                }catch(Exception e){}
            }
        }
        

        如果您有任何想法,我会很高兴听到它。

        希望这篇文章至少能帮助那些在“Dex”图书馆工作的人...... 真诚的,一个小程序员

        感谢此链接How do I invoke a Java method when given the method name as a string? 我的解决方案即使不是很干净也能正常工作。我的代码不起作用的原因是因为我存储了类对象,如果直接执行它,则错误消失。如果有任何解释来评论!

        package com.YourPackage;
        public class MyClass{
            public void main(Object obj){
                try{
                    Method mainMethod = obj.getClass().getMethod("methodToCall");
                    mainMethod.invoke(obj); // Works, invoke the right method
                }catch(Exception e){}
            }
        }
        

0 个答案:

没有答案