| 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);
|
| +
|
| + }
|
| +}
|
|
|