android動態加載

jopen 8年前發布 | 9K 次閱讀 Android開發 移動開發

本文引用自http://www.cnblogs.com/over140/archive/2011/11/23/2259367.html


1.android動態加載jar包

    a.新建java工程

        創建接口:

package com.example.testload;

public interface IDynamic {
    public String helloWorld();
}
       創建一個類實現該接口:

package com.test.jarload;

public class DynamicTest implements IDynamic {

    @Override
    public String helloWorld() {
        return "Hello World!";
    }
}
然后將該java工程導出到jar文件,這里我導出的是load.jar注意: 導出jar文件的時候,不要勾選接口選項
 

     因為在android工程中,是不能直接運行jar文件的,所以我們需要利用android提供的dx來進行轉換: 

     進入sdk的目錄,找到dx文件,注意大部分sdk的dx文件是在platform-tools文件夾下,也有一些是在build-tools文件夾下,總之進入包含有dx文件的文件夾中,將我們之前導出的jar文件load.jar拷貝到給目錄中,然后用命令行進入該目錄,執行dx --dex --output=test.jar load.jar 會發現在該目錄下生成了一個test.jar文件,這個文件就是android工程可以加載的文件,將該文件拷貝到sdcard的根目錄中。

   

    新建一個android工程:

    代碼比較簡單,如下:

    首先需要將之前的接口在該工程中在聲明一遍:

    

public interface IDynamic {
    public String helloWorld();
}
    MainActivity的代碼比較簡單,直接貼代碼了:

 

mToastButton = (Button) findViewById(R.id.toast_button);

        mToastButton.setOnClickListener(new View.OnClickListener() {
            @SuppressLint("NewApi")
            public void onClick(View view) {
                final File optimizedDexOutputPath = new File(Environment.getExternalStorageDirectory().toString()
                    + File.separator + "test.jar");
                String path = optimizedDexOutputPath.getAbsolutePath();
                DexClassLoader cl = new DexClassLoader(optimizedDexOutputPath.getAbsolutePath(),
                    Environment.getExternalStorageDirectory().toString(), null, getClassLoader());
                Class libProviderClazz = null;

                try {
                    libProviderClazz = cl.loadClass("com.test.jarload.DynamicTest");

                    IDynamic lib = (IDynamic)libProviderClazz.newInstance();

                    Toast.makeText(MainActivity.this, lib.helloWorld(), Toast.LENGTH_SHORT).show();
                } catch (Exception exception) {
                    exception.printStackTrace();
                }
            }
        });



下面看看android中動態加載未安裝的apk文件:

    首先新建一個android工程,創建一個activity如下:

public class TestBActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }

    public String getMoney() {
        return "1";
    }

}

然后將該android工程打包成apk文件(test.apk),拷貝到sdcard的根目錄中:

     然后新建另外一個android工程用來加載之前導出的apk文件:

    主要代碼如下:

String path = Environment.getExternalStorageDirectory() + "/";
        String filename = "test.apk";
        DexClassLoader classLoader = new DexClassLoader(path + filename, path,
                null, getClassLoader());

        try {
            Class mLoadClass = classLoader.loadClass("com.nmbb.TestBActivity");
            Constructor constructor = mLoadClass.getConstructor(new Class[] {});
            Object TestBActivity = constructor.newInstance(new Object[] {});

            Method getMoney = mLoadClass.getMethod("getMoney", null);
            getMoney.setAccessible(true);
            Object money = getMoney.invoke(TestBActivity, null);
            Toast.makeText(this, money.toString(), Toast.LENGTH_LONG).show();

        } catch (Exception e) {
            e.printStackTrace();
        }

      注意:以上不管是動態運行jar文件還是apk文件,都需要添加sdcard的讀取權限:

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








來自: http://blog.csdn.net//mockingbirds/article/details/44785289

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!