| package org.golang.app; |
| |
| import android.app.Activity; |
| import android.app.NativeActivity; |
| import android.content.Context; |
| import android.content.pm.ActivityInfo; |
| import android.content.pm.PackageManager; |
| import android.os.Bundle; |
| import android.util.Log; |
| import android.view.KeyCharacterMap; |
| |
| public class GoNativeActivity extends NativeActivity { |
| private static GoNativeActivity goNativeActivity; |
| |
| public GoNativeActivity() { |
| super(); |
| goNativeActivity = this; |
| } |
| |
| String getTmpdir() { |
| return getCacheDir().getAbsolutePath(); |
| } |
| |
| static int getRune(int deviceId, int keyCode, int metaState) { |
| try { |
| int rune = KeyCharacterMap.load(deviceId).get(keyCode, metaState); |
| if (rune == 0) { |
| return -1; |
| } |
| return rune; |
| } catch (KeyCharacterMap.UnavailableException e) { |
| return -1; |
| } catch (Exception e) { |
| Log.e("Go", "exception reading KeyCharacterMap", e); |
| return -1; |
| } |
| } |
| |
| private void load() { |
| // Interestingly, NativeActivity uses a different method |
| // to find native code to execute, avoiding |
| // System.loadLibrary. The result is Java methods |
| // implemented in C with JNIEXPORT (and JNI_OnLoad) are not |
| // available unless an explicit call to System.loadLibrary |
| // is done. So we do it here, borrowing the name of the |
| // library from the same AndroidManifest.xml metadata used |
| // by NativeActivity. |
| try { |
| ActivityInfo ai = getPackageManager().getActivityInfo( |
| getIntent().getComponent(), PackageManager.GET_META_DATA); |
| if (ai.metaData == null) { |
| Log.e("Go", "loadLibrary: no manifest metadata found"); |
| return; |
| } |
| String libName = ai.metaData.getString("android.app.lib_name"); |
| System.loadLibrary(libName); |
| } catch (Exception e) { |
| Log.e("Go", "loadLibrary failed", e); |
| } |
| } |
| |
| @Override |
| public void onCreate(Bundle savedInstanceState) { |
| load(); |
| super.onCreate(savedInstanceState); |
| } |
| } |