This is done by moving app.Context to internal/mobileinit, introducing mobileinit.SetCurrentContext and, making bind/java depend on it. TODO: check gomobile bind's proguard rule - context lookup was implemented through reflection on android.app.AppGlobals class. Change-Id: Ieb6ad503eeef8c2c1c5836a21c667938c5a701a2 Reviewed-on: https://go-review.googlesource.com/12279 Reviewed-by: David Crawshaw <crawshaw@golang.org>
62 lines
1.9 KiB
Go
62 lines
1.9 KiB
Go
// Copyright 2015 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package mobileinit
|
|
|
|
/*
|
|
#include <jni.h>
|
|
#include <stdlib.h>
|
|
|
|
// current_vm is stored to initialize other cgo packages.
|
|
//
|
|
// As all the Go packages in a program form a single shared library,
|
|
// there can only be one JNI_OnLoad function for initialization. In
|
|
// OpenJDK there is JNI_GetCreatedJavaVMs, but this is not available
|
|
// on android.
|
|
JavaVM* current_vm;
|
|
|
|
// current_ctx is Android's android.context.Context. May be NULL.
|
|
jobject current_ctx;
|
|
|
|
// Set current_vm and current_ctx. The ctx passed in must be a global
|
|
// reference instance.
|
|
void set_vm_ctx(JavaVM* vm, jobject ctx) {
|
|
current_vm = vm;
|
|
current_ctx = ctx;
|
|
// TODO: check leak
|
|
}
|
|
*/
|
|
import "C"
|
|
|
|
import "unsafe"
|
|
|
|
// SetCurrentContext populates the global Context object with the specified
|
|
// current JavaVM instance (vm) and android.context.Context object (ctx).
|
|
// The android.context.Context object must be a global reference.
|
|
func SetCurrentContext(vm, ctx unsafe.Pointer) {
|
|
C.set_vm_ctx((*C.JavaVM)(vm), (C.jobject)(ctx))
|
|
}
|
|
|
|
// TODO(hyangah): should the app package have Context? It may be useful for
|
|
// external packages that need to access android context and vm.
|
|
|
|
// Context holds global OS-specific context.
|
|
//
|
|
// Its extra methods are deliberately difficult to access because they must be
|
|
// used with care. Their use implies the use of cgo, which probably requires
|
|
// you understand the initialization process in the app package. Also care must
|
|
// be taken to write both Android, iOS, and desktop-testing versions to
|
|
// maintain portability.
|
|
type Context struct{}
|
|
|
|
// AndroidContext returns a jobject for the app android.context.Context.
|
|
func (Context) AndroidContext() unsafe.Pointer {
|
|
return unsafe.Pointer(C.current_ctx)
|
|
}
|
|
|
|
// JavaVM returns a JNI *JavaVM.
|
|
func (Context) JavaVM() unsafe.Pointer {
|
|
return unsafe.Pointer(C.current_vm)
|
|
}
|