|  | // Copyright 2014 The Chromium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | // This is an example of an Android Mojo app that is composed of native code and | 
|  | // Java code that the native code calls into. In particular, we call to Java | 
|  | // upon entering MojoMain to retrieve the name of the device that the | 
|  | // application is running on and print it out to the log. | 
|  | // | 
|  | // To run the example: | 
|  | //  - build and install the MojoShell on the device: | 
|  | //        ninja -C some_place mojo_shell_apk | 
|  | //        adb install -r some_place/apks/MojoShell.apk | 
|  | //  - install forwarder on the device: | 
|  | //        ninja -C some_place forwarder | 
|  | //        adb push some_place/forwarder /data/tmp/forwarder | 
|  | //  - run the forwarder on the device: | 
|  | //        adb shell /data/tmp/forwarder 4444:4444 | 
|  | //  - build the example: | 
|  | //        ninja -C some_place examples/device_name | 
|  | //  - set up the http server in your output directory: | 
|  | //        python -m SimpleHTTPServer 4444 | 
|  | //  - build/android/adb_run_mojo_shell | 
|  | //        http://127.0.0.1:4444/obj/examples/device_name/device_name.mojo | 
|  |  | 
|  | #include "base/android/jni_string.h" | 
|  | #include "jni/DeviceName_jni.h" | 
|  | #include "mojo/public/c/system/main.h" | 
|  | #include "mojo/public/cpp/system/core.h" | 
|  |  | 
|  | namespace mojo { | 
|  |  | 
|  | namespace examples { | 
|  |  | 
|  | bool RegisterDeviceJni(JNIEnv* env) { | 
|  | return RegisterNativesImpl(env); | 
|  | } | 
|  |  | 
|  | // Simplest example of a function that needs to call into Java. | 
|  | std::string GetDeviceName() { | 
|  | JNIEnv* env = base::android::AttachCurrentThread(); | 
|  | return base::android::ConvertJavaStringToUTF8( | 
|  | env, Java_DeviceName_getName(env).obj()); | 
|  | } | 
|  |  | 
|  | // Example of a function that need to access the application context - see | 
|  | // InitApplicationContext() below. | 
|  | std::string GetApplicationClassName() { | 
|  | JNIEnv* env = base::android::AttachCurrentThread(); | 
|  | jobject context = base::android::GetApplicationContext(); | 
|  | return base::android::ConvertJavaStringToUTF8( | 
|  | env, Java_DeviceName_getApplicationClassName(env, context).obj()); | 
|  | } | 
|  |  | 
|  | }  // namespace examples | 
|  | }  // namespace mojo | 
|  |  | 
|  | MojoResult MojoMain(MojoHandle application_request) { | 
|  | // Call a Java function to demonstrate that the JNI was correctly set up. | 
|  | LOG(INFO) << "Device name: " << mojo::examples::GetDeviceName(); | 
|  |  | 
|  | // Call a function that uses the application context to demonstrate that it | 
|  | // was properly set. | 
|  | LOG(INFO) << "Application class: " | 
|  | << mojo::examples::GetApplicationClassName(); | 
|  |  | 
|  | // Call a Mojo core function to demonstrate that the thunks were properly set. | 
|  | MojoTimeTicks ticks = MojoGetTimeTicksNow(); | 
|  | LOG(INFO) << "Timeticks: " << ticks; | 
|  |  | 
|  | return MOJO_RESULT_OK; | 
|  | } | 
|  |  | 
|  | JNI_EXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved) { | 
|  | base::android::InitVM(vm); | 
|  | JNIEnv* env = base::android::AttachCurrentThread(); | 
|  |  | 
|  | if (!mojo::examples::RegisterDeviceJni(env)) | 
|  | return -1; | 
|  |  | 
|  | return JNI_VERSION_1_4; | 
|  | } | 
|  |  | 
|  | // This is needed only if the application actually needs to access the | 
|  | // application context. For instance, GetDeviceName() itself doesn't need it, | 
|  | // but we use it for demonstrative purposes in GetApplicationClassName(). | 
|  | extern "C" JNI_EXPORT void InitApplicationContext( | 
|  | const base::android::JavaRef<jobject>& context) { | 
|  | JNIEnv* env = base::android::AttachCurrentThread(); | 
|  | base::android::InitApplicationContext(env, context); | 
|  | } |