mirror of
https://git.sr.ht/~eliasnaur/gio
synced 2026-07-01 07:35:40 +00:00
app: add Handle type and PlatformHandle()
On Android, allow access to JVM and Application context. Signed-off-by: Greg Pomerantz <gmp.gio@wow.st>
This commit is contained in:
committed by
Elias Naur
parent
175144fa99
commit
5ef176af81
@@ -9,6 +9,13 @@ import (
|
||||
"gioui.org/app/internal/window"
|
||||
)
|
||||
|
||||
type Handle window.Handle
|
||||
|
||||
// PlatformHandle returns the platform specific Handle.
|
||||
func PlatformHandle() *Handle {
|
||||
return (*Handle)(window.PlatformHandle)
|
||||
}
|
||||
|
||||
// extraArgs contains extra arguments to append to
|
||||
// os.Args. The arguments are separated with |.
|
||||
// Useful for running programs on mobiles where the
|
||||
|
||||
@@ -46,7 +46,7 @@ public class GioView extends SurfaceView implements Choreographer.FrameCallback
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
System.loadLibrary("gio");
|
||||
runGoMain(dataDirUTF8);
|
||||
runGoMain(dataDirUTF8, appCtx);
|
||||
jniLoaded = true;
|
||||
}
|
||||
}
|
||||
@@ -219,7 +219,7 @@ public class GioView extends SurfaceView implements Choreographer.FrameCallback
|
||||
static private native void onFrameCallback(long handle, long nanos);
|
||||
static private native boolean onBack(long handle);
|
||||
static private native void onFocusChange(long handle, boolean focus);
|
||||
static private native void runGoMain(byte[] dataDir);
|
||||
static private native void runGoMain(byte[] dataDir, Context context);
|
||||
|
||||
private static class InputConnection extends BaseInputConnection {
|
||||
private final Editable editable;
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
// +build !android
|
||||
|
||||
package window
|
||||
|
||||
var PlatformHandle *Handle
|
||||
|
||||
type Handle struct{}
|
||||
@@ -0,0 +1,11 @@
|
||||
package window
|
||||
|
||||
var PlatformHandle *Handle
|
||||
|
||||
type Handle struct {
|
||||
// JVM is the JNI *JVM pointer.
|
||||
JVM uintptr
|
||||
// Context is a global reference to the application's
|
||||
// android.content.Context instance.
|
||||
Context uintptr
|
||||
}
|
||||
@@ -22,7 +22,7 @@ JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved) {
|
||||
static const JNINativeMethod methods[] = {
|
||||
{
|
||||
.name = "runGoMain",
|
||||
.signature = "([B)V",
|
||||
.signature = "([BLandroid/content/Context;)V",
|
||||
.fnPtr = runGoMain
|
||||
},
|
||||
{
|
||||
|
||||
@@ -80,7 +80,7 @@ func jniGetStaticMethodID(env *C.JNIEnv, class C.jclass, method, sig string) C.j
|
||||
}
|
||||
|
||||
//export runGoMain
|
||||
func runGoMain(env *C.JNIEnv, class C.jclass, jdataDir C.jbyteArray) {
|
||||
func runGoMain(env *C.JNIEnv, class C.jclass, jdataDir C.jbyteArray, context C.jobject) {
|
||||
dirBytes := C.gio_jni_GetByteArrayElements(env, jdataDir)
|
||||
if dirBytes == nil {
|
||||
panic("runGoMain: GetByteArrayElements failed")
|
||||
@@ -89,6 +89,12 @@ func runGoMain(env *C.JNIEnv, class C.jclass, jdataDir C.jbyteArray) {
|
||||
dataDir := C.GoStringN((*C.char)(unsafe.Pointer(dirBytes)), n)
|
||||
dataDirChan <- dataDir
|
||||
C.gio_jni_ReleaseByteArrayElements(env, jdataDir, dirBytes)
|
||||
context = C.gio_jni_NewGlobalRef(env, context)
|
||||
|
||||
PlatformHandle = &Handle{
|
||||
JVM: uintptr(unsafe.Pointer(theJVM)),
|
||||
Context: uintptr(context),
|
||||
}
|
||||
runMain()
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user