| Index: base/android/jni_generator/SampleForTests.java | 
| diff --git a/base/android/jni_generator/SampleForTests.java b/base/android/jni_generator/SampleForTests.java | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..a081921762e458d4511fa51b3e9e757d976ef4e4 | 
| --- /dev/null | 
| +++ b/base/android/jni_generator/SampleForTests.java | 
| @@ -0,0 +1,150 @@ | 
| +// Copyright (c) 2012 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. | 
| + | 
| +package org.chromium.example.jni_generator; | 
| + | 
| +// This class serves as a reference test for the bindings generator, and as example documentation | 
| +// for how to use the jni generator. | 
| +// The C++ counter-part is sample_for_tests.cc. | 
| +// jni_generator.gyp has a jni_generator_tests target that will: | 
| +//   * Generate a header file for the JNI bindings based on this file. | 
| +//   * Compile sample_for_tests.cc using the generated header file. | 
| +//   * link a native executable to prove the generated header + cc file are self-contained. | 
| +// All comments are informational only, and are ignored by the jni generator. | 
| +class SampleForTests { | 
| +  // Classes can store their C++ pointer counter part as an int that is normally initialized by | 
| +  // calling out a nativeInit() function. | 
| +  int nativePtr; | 
| + | 
| +  // You can define methods and attributes on the java class just like any other. | 
| +  // Methods without the @CalledByNative annotation won't be exposed to JNI. | 
| +  public SampleForTests() { | 
| +  } | 
| + | 
| +  public void startExample() { | 
| +      // Calls native code and holds a pointer to the C++ class. | 
| +      nativePtr = nativeInit("myParam"); | 
| +  } | 
| + | 
| +  public void doStuff() { | 
| +      // This will call CPPClass::Method() using nativePtr as a pointer to the object. This must be | 
| +      // done to: | 
| +      // * avoid leaks. | 
| +      // * using finalizers are not allowed to destroy the cpp class. | 
| +      nativeMethod(nativePtr); | 
| +  } | 
| + | 
| +  public void finishExample() { | 
| +      // We're done, so let's destroy nativePtr object. | 
| +      nativeDestroy(nativePtr); | 
| +  } | 
| + | 
| +  // ----------------------------------------------------------------------------------------------- | 
| +  // The following methods demonstrate exporting Java methods for invocation from C++ code. | 
| +  // Java functions are mapping into C global functions by prefixing the method name with | 
| +  // "Java_<Class>_" | 
| +  // This is triggered by the @CalledByNative annotation; the methods may be named as you wish. | 
| + | 
| +  // Exported to C++ as: | 
| +  //   Java_Example_javaMethod(JNIEnv* env, jobject obj, jint foo, jint bar) | 
| +  // Typically the C++ code would have obtained the jobject via the Init() call described above. | 
| +  @CalledByNative | 
| +  public int javaMethod(int foo, | 
| +                        int bar) { | 
| +      return 0; | 
| +  } | 
| + | 
| +  // Exported to C++ as Java_Example_staticJavaMethod(JNIEnv* env) | 
| +  // Note no jobject argument, as it is static. | 
| +  @CalledByNative | 
| +  public static boolean staticJavaMethod() { | 
| +      return true; | 
| +  } | 
| + | 
| +  // No prefix, so this method is package private. It will still be exported. | 
| +  @CalledByNative | 
| +  void packagePrivateJavaMethod() {} | 
| + | 
| +  // Note the "Unchecked" suffix. By default, @CalledByNative will always generate bindings that | 
| +  // call CheckException(). With "@CalledByNativeUnchecked", the client C++ code is responsible to | 
| +  // call ClearException() and act as appropriate. | 
| +  // See more details at the "@CalledByNativeUnchecked" annotation. | 
| +  @CalledByNativeUnchecked | 
| +  void methodThatThrowsException() throws Exception {} | 
| + | 
| +  //------------------------------------------------------------------------------------------------ | 
| +  // Java fields which are accessed from C++ code must be annotated with @AccessedByNative to | 
| +  // prevent them being eliminated when unreferenced code is stripped. | 
| +  @AccessedByNative | 
| +  private int javaField; | 
| + | 
| +  //------------------------------------------------------------------------------------------------ | 
| +  // The following methods demonstrate declaring methods to call into C++ from Java. | 
| +  // The generator detects the "native" and "static" keywords, the type and name of the first | 
| +  // parameter, and the "native" prefix to the function name to determine the C++ function | 
| +  // signatures. Besides these constraints the methods can be freely named. | 
| + | 
| +  // This declares a C++ function which the application code must implement: | 
| +  //   static jint Init(JNIEnv* env, jobject obj); | 
| +  // The jobject parameter refers back to this java side object instance. | 
| +  // The implementation must return the pointer to the C++ object cast to jint. | 
| +  // The caller of this method should store it, and supply it as a the nativeCPPClass param to | 
| +  // subsequent native method calls (see the methods below that take an "int native..." as first | 
| +  // param). | 
| +  private native int nativeInit(); | 
| + | 
| +  // This defines a function binding to the associated C++ class member function. The name is | 
| +  // derived from |nativeDestroy| and |nativeCPPClass| to arrive at CPPClass::Destroy() (i.e. native | 
| +  // prefixes stripped). | 
| +  // The |nativeCPPClass| is automatically cast to type CPPClass* in order to obtain the object on | 
| +  // which to invoke the member function. | 
| +  private native void nativeDestroy(int nativeCPPClass); | 
| + | 
| +  // This declares a C++ function which the application code must implement: | 
| +  //   static jdouble GetDoubleFunction(JNIEnv* env, jobject obj); | 
| +  // The jobject parameter refers back to this java side object instance. | 
| +  private native double nativeGetDoubleFunction(); | 
| + | 
| +  // Similar to nativeGetDoubleFunction(), but here the C++ side will receive a jclass rather than | 
| +  // jobject param, as the function is declared static. | 
| +  private static native float nativeGetFloatFunction(); | 
| + | 
| +  // This function takes a non-POD datatype. We have a list mapping them to their full classpath in | 
| +  // jni_generator.py JavaParamToJni. If you require a new datatype, make sure you add to that | 
| +  // function. | 
| +  private native void nativeSetNonPODDatatype(Rect rect); | 
| + | 
| +  // This declares a C++ function which the application code must implement: | 
| +  //   static ScopedJavaLocalRef<jobject> GetNonPODDatatype(JNIEnv* env, jobject obj); | 
| +  // The jobject parameter refers back to this java side object instance. | 
| +  // Note that it returns a ScopedJavaLocalRef<jobject> so that you don' have to worry about | 
| +  // deleting the JNI local reference.  This is similar with Strings and arrays. | 
| +  private native Object nativeGetNonPODDatatype(); | 
| + | 
| +  // Similar to nativeDestroy above, this will cast nativeCPPClass into pointer of CPPClass type and | 
| +  // call its Method member function. | 
| +  private native int nativeMethod(int nativeCPPClass); | 
| + | 
| +  // Similar to nativeMethod above, but here the C++ fully qualified class name is taken from the | 
| +  // comment rather than parameter name, which can thus be chosen freely. | 
| +  private native double nativeMethodOtherP0(int nativeCPPClass /* cpp_namespace::CPPClass */); | 
| + | 
| +  // An inner class has some special attributes for annotation. | 
| +  class InnerClass { | 
| +    @CalledByNative("InnerClass") | 
| +    public float JavaInnerMethod() { | 
| +    } | 
| + | 
| +    @CalledByNative("InnerClass") | 
| +    public static void javaInnerFunction() { | 
| +    } | 
| + | 
| +    @NativeCall("InnerClass") | 
| +    private static native int nativeInnerFunction(); | 
| + | 
| +    @NativeCall("InnerClass") | 
| +    private static native String nativeInnerMethod(int nativeCPPClass); | 
| + | 
| +  } | 
| +} | 
|  |