用类加载器加载,可以自定义ClassLoader , jar文件可以放到assert目录下。

解决方案 »

  1.   

    谢谢上面两位,不过我还不是很明白。我目前所作如下:在应用程序的这个项目中,有两个文件MainActivity.java和IFuncEntry.java
    其中,MainActivity.javapackage com.testapp.mytest;......import dalvik.system.DexClassLoader;
    public class MainActivity extends Activity {    @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            
            Button  btnStart = (Button)findViewById(R.id.button_start);
            View.OnClickListener l = new View.OnClickListener(){
                @Override
                public void onClick(View arg0) {
                    final File optimizedDexOutputPath = 
                        new File(Environment.getExternalStorageDirectory().toString() + "/tmp/FuncEntry.jar");
                    DexClassLoader cl = new DexClassLoader(optimizedDexOutputPath.getAbsolutePath(), 
                                                           Environment.getExternalStorageDirectory().toString(), 
                                                           null, 
                                                           getClassLoader());
                    Class libProviderClazz = null;
                    try {
                        libProviderClazz = cl.loadClass("com.testapp.mytest.FuncEntry");
                        IFuncEntry lib = (IFuncEntry)libProviderClazz.newInstance();                    if(2 == lib.func(1)){
                            Toast.makeText(MainActivity.this, "Good job!", Toast.LENGTH_SHORT).show();
                        }
                        else{
                            Toast.makeText(MainActivity.this, "Damn it!", Toast.LENGTH_SHORT).show();
                        }
                    } catch (Exception exception) {
                        exception.printStackTrace();
                    }
                }        
            };
            btnStart.setOnClickListener(l);
        }
    }
    IFuncEntry.java的代码package com.testapp.mytest;public interface IFuncEntry {
        public  int  func (int i);
    }
    在库的这个项目中,有两个文件IFuncEntry.java和FuncEntry.java两个文件
    其中,IFuncEntry.java如下package com.testapp.mytest;public interface IFuncEntry {
        public  int  func (int i);
    }
    而FuncEntry.java如下package com.testapp.mytest;public class FuncEntry implements IFuncEntry{
    public int func(int i){
    return i + 1;
    }
    }
    将库编译生成FuncEntry.jar,并且放在SD卡的tmp目录下,运行应用,点击按钮以后,会在这一句崩溃                DexClassLoader cl = new DexClassLoader(optimizedDexOutputPath.getAbsolutePath(), 
                                                           Environment.getExternalStorageDirectory().toString(), 
                                                           null, 
                                                           getClassLoader());
    1> 我把两个项目,都声明成同一个package ("package com.testapp.mytest"),这样正确吗?
    2> 在应用里面,我也加入了一个IFuncEntry.java文件,否则以下语句编译不过,我的处理正确吗?IFuncEntry lib = (IFuncEntry)libProviderClazz.newInstance();3> 为什么会在以上地方崩溃?应该如何修改呢?
    谢谢
      

  2.   

    http://www.cnblogs.com/over140/archive/2011/11/23/2259367.html
      

  3.   


    你把奔溃的log贴出来看看