You've already forked android_translation_layer
mirror of
https://gitlab.com/android_translation_layer/android_translation_layer.git
synced 2025-10-27 11:48:10 -07:00
auto find main activity using AndroidManifest.xml
This commit is contained in:
@@ -43,10 +43,11 @@ void set_up_handle_cache(JNIEnv *env, char *apk_main_activity_class)
|
|||||||
{
|
{
|
||||||
(*env)->GetJavaVM(env, &jvm);
|
(*env)->GetJavaVM(env, &jvm);
|
||||||
|
|
||||||
handle_cache.apk_main_activity.class = _REF((*env)->FindClass(env, apk_main_activity_class));
|
handle_cache.apk_main_activity.class = _REF((*env)->FindClass(env, "android/app/Activity"));
|
||||||
if((*env)->ExceptionCheck(env))
|
if((*env)->ExceptionCheck(env))
|
||||||
(*env)->ExceptionDescribe(env);
|
(*env)->ExceptionDescribe(env);
|
||||||
handle_cache.apk_main_activity.object = _REF((*env)->NewObject(env, handle_cache.apk_main_activity.class, _METHOD(handle_cache.apk_main_activity.class, "<init>", "()V")));
|
jmethodID createMainActivity = _STATIC_METHOD(handle_cache.apk_main_activity.class, "createMainActivity", "(Ljava/lang/String;)Landroid/app/Activity;");
|
||||||
|
handle_cache.apk_main_activity.object = _REF((*env)->CallStaticObjectMethod(env, handle_cache.apk_main_activity.class, createMainActivity, _JSTRING(apk_main_activity_class)));
|
||||||
if((*env)->ExceptionCheck(env))
|
if((*env)->ExceptionCheck(env))
|
||||||
(*env)->ExceptionDescribe(env);
|
(*env)->ExceptionDescribe(env);
|
||||||
handle_cache.apk_main_activity.onCreate = _METHOD(handle_cache.apk_main_activity.class, "onCreate", "(Landroid/os/Bundle;)V");
|
handle_cache.apk_main_activity.onCreate = _METHOD(handle_cache.apk_main_activity.class, "onCreate", "(Landroid/os/Bundle;)V");
|
||||||
|
|||||||
@@ -18,14 +18,42 @@ import android.view.WindowManagerImpl;
|
|||||||
import org.xmlpull.v1.XmlPullParser;
|
import org.xmlpull.v1.XmlPullParser;
|
||||||
import org.xmlpull.v1.XmlPullParserFactory;
|
import org.xmlpull.v1.XmlPullParserFactory;
|
||||||
|
|
||||||
|
import com.reandroid.arsc.chunk.xml.AndroidManifestBlock;
|
||||||
|
|
||||||
import java.io.FileReader;
|
import java.io.FileReader;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
import java.io.StringReader;
|
import java.io.StringReader;
|
||||||
|
import java.lang.reflect.Constructor;
|
||||||
|
import java.lang.reflect.InvocationTargetException;
|
||||||
|
|
||||||
public class Activity extends Context {
|
public class Activity extends Context {
|
||||||
LayoutInflater layout_inflater;
|
LayoutInflater layout_inflater;
|
||||||
Window window = new Window();
|
Window window = new Window();
|
||||||
int requested_orientation = -1 /*ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED*/; // dummy
|
int requested_orientation = -1 /*ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED*/; // dummy
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper function to be called from native code to construct main activity
|
||||||
|
*
|
||||||
|
* @param className class name of activity or null
|
||||||
|
* @return instance of main activity class
|
||||||
|
*/
|
||||||
|
private static Activity createMainActivity(String className) throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, IOException {
|
||||||
|
if (className == null) {
|
||||||
|
InputStream inStream = ClassLoader.getSystemClassLoader().getResourceAsStream("AndroidManifest.xml");
|
||||||
|
AndroidManifestBlock block = AndroidManifestBlock.load(inStream);
|
||||||
|
className = block.getMainActivity().searchAttributeByResourceId(AndroidManifestBlock.ID_name).getValueAsString();
|
||||||
|
if (className.startsWith(".")) {
|
||||||
|
className = block.getPackageName() + className;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
className = className.replace('/', '.');
|
||||||
|
}
|
||||||
|
Class<? extends Activity> cls = Class.forName(className).asSubclass(Activity.class);
|
||||||
|
Constructor<? extends Activity> constructor = cls.getConstructor();
|
||||||
|
return constructor.newInstance();
|
||||||
|
}
|
||||||
|
|
||||||
protected void set_window(long native_window) {
|
protected void set_window(long native_window) {
|
||||||
window.native_window = native_window;
|
window.native_window = native_window;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -280,11 +280,6 @@ static void open(GtkApplication *app, GFile** files, gint nfiles, const gchar* h
|
|||||||
|
|
||||||
free(app_lib_dir);
|
free(app_lib_dir);
|
||||||
|
|
||||||
if(!d->apk_main_activity_class) {
|
|
||||||
printf("error: missing required option --launch-activity <activity>.\nyou can specify --help to see the list of options\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
set_up_handle_cache(env, d->apk_main_activity_class);
|
set_up_handle_cache(env, d->apk_main_activity_class);
|
||||||
|
|
||||||
jclass display_class = (*env)->FindClass(env, "android/view/Display");
|
jclass display_class = (*env)->FindClass(env, "android/view/Display");
|
||||||
|
|||||||
Reference in New Issue
Block a user