我正在开发Android应用程序(在Android工作室下),允许用户在运行时运行“Java android”代码。
我的第一项研究帮助我从“MyClass.java”创建一个库,Android应用程序可以理解。
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”
C:\ Program Files \ Android \ Android Studio \ jre \ bin \ jar cvf“MyClass.jar”com / YourPackage / MyClass.class
调用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" />
此时我可以调用自定义库中的方法。但现在我需要从库中调用我的主要活动的方法。简化我的问题是:
第一个问题,我需要的是从库中看到的异常视图,我想附加并在我的库和我的应用程序之间建立依赖关系。因此,我没有找到任何可以帮助我的东西。 我带来的唯一想法是将一个对象参数传递给我的“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){}
}
}