mirror of
https://git.sr.ht/~eliasnaur/gio
synced 2026-07-07 10:25:37 +00:00
app/internal/headless: [Android] expose Java initialization method
Android apps may want to run Go code independent of the Gio Android Activity. Expose a Gio.init Java method public for early loading and initialization of the Go library. Signed-off-by: Elias Naur <mail@eliasnaur.com>
This commit is contained in:
@@ -0,0 +1,39 @@
|
|||||||
|
// SPDX-License-Identifier: Unlicense OR MIT
|
||||||
|
|
||||||
|
package org.gioui;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
|
||||||
|
import java.io.UnsupportedEncodingException;
|
||||||
|
|
||||||
|
public class Gio {
|
||||||
|
private final static Object initLock = new Object();
|
||||||
|
private static boolean jniLoaded;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* init loads and initializes the Go native library and runs
|
||||||
|
* the Go main function.
|
||||||
|
*
|
||||||
|
* It is exported for use by Android apps that need to run Go code
|
||||||
|
* outside the lifecycle of the Gio activity.
|
||||||
|
*/
|
||||||
|
public static synchronized void init(Context appCtx) {
|
||||||
|
synchronized (initLock) {
|
||||||
|
if (jniLoaded) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
String dataDir = appCtx.getFilesDir().getAbsolutePath();
|
||||||
|
byte[] dataDirUTF8;
|
||||||
|
try {
|
||||||
|
dataDirUTF8 = dataDir.getBytes("UTF-8");
|
||||||
|
} catch (UnsupportedEncodingException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
System.loadLibrary("gio");
|
||||||
|
runGoMain(dataDirUTF8, appCtx);
|
||||||
|
jniLoaded = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static private native void runGoMain(byte[] dataDir, Context context);
|
||||||
|
}
|
||||||
@@ -42,24 +42,6 @@ public class GioView extends SurfaceView implements Choreographer.FrameCallback
|
|||||||
private final Handler handler;
|
private final Handler handler;
|
||||||
private long nhandle;
|
private long nhandle;
|
||||||
|
|
||||||
private static synchronized void initialize(Context appCtx) {
|
|
||||||
synchronized (initLock) {
|
|
||||||
if (jniLoaded) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
String dataDir = appCtx.getFilesDir().getAbsolutePath();
|
|
||||||
byte[] dataDirUTF8;
|
|
||||||
try {
|
|
||||||
dataDirUTF8 = dataDir.getBytes("UTF-8");
|
|
||||||
} catch (UnsupportedEncodingException e) {
|
|
||||||
throw new RuntimeException(e);
|
|
||||||
}
|
|
||||||
System.loadLibrary("gio");
|
|
||||||
runGoMain(dataDirUTF8, appCtx);
|
|
||||||
jniLoaded = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public GioView(Context context) {
|
public GioView(Context context) {
|
||||||
this(context, null);
|
this(context, null);
|
||||||
}
|
}
|
||||||
@@ -69,7 +51,7 @@ public class GioView extends SurfaceView implements Choreographer.FrameCallback
|
|||||||
|
|
||||||
handler = new Handler();
|
handler = new Handler();
|
||||||
// Late initialization of the Go runtime to wait for a valid context.
|
// Late initialization of the Go runtime to wait for a valid context.
|
||||||
initialize(context.getApplicationContext());
|
Gio.init(context.getApplicationContext());
|
||||||
|
|
||||||
nhandle = onCreateView(this);
|
nhandle = onCreateView(this);
|
||||||
imm = (InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE);
|
imm = (InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE);
|
||||||
@@ -260,7 +242,6 @@ public class GioView extends SurfaceView implements Choreographer.FrameCallback
|
|||||||
static private native void onFrameCallback(long handle, long nanos);
|
static private native void onFrameCallback(long handle, long nanos);
|
||||||
static private native boolean onBack(long handle);
|
static private native boolean onBack(long handle);
|
||||||
static private native void onFocusChange(long handle, boolean focus);
|
static private native void onFocusChange(long handle, boolean focus);
|
||||||
static private native void runGoMain(byte[] dataDir, Context context);
|
|
||||||
|
|
||||||
private static class InputConnection extends BaseInputConnection {
|
private static class InputConnection extends BaseInputConnection {
|
||||||
private final Editable editable;
|
private final Editable editable;
|
||||||
|
|||||||
@@ -86,8 +86,8 @@ func jniGetStaticMethodID(env *C.JNIEnv, class C.jclass, method, sig string) C.j
|
|||||||
return C.gio_jni_GetStaticMethodID(env, class, m, s)
|
return C.gio_jni_GetStaticMethodID(env, class, m, s)
|
||||||
}
|
}
|
||||||
|
|
||||||
//export Java_org_gioui_GioView_runGoMain
|
//export Java_org_gioui_Gio_runGoMain
|
||||||
func Java_org_gioui_GioView_runGoMain(env *C.JNIEnv, class C.jclass, jdataDir C.jbyteArray, context C.jobject) {
|
func Java_org_gioui_Gio_runGoMain(env *C.JNIEnv, class C.jclass, jdataDir C.jbyteArray, context C.jobject) {
|
||||||
if res := C.gio_jni_GetJavaVM(env, &theJVM); res != 0 {
|
if res := C.gio_jni_GetJavaVM(env, &theJVM); res != 0 {
|
||||||
panic("gio: GetJavaVM failed")
|
panic("gio: GetJavaVM failed")
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user