Chromium Code Reviews| 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..1b212fad01015bf5c15df614cffd1d38f8df855a |
| --- /dev/null |
| +++ b/base/android/jni_generator/SampleForTests.java |
| @@ -0,0 +1,161 @@ |
| +// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
|
joth
2012/02/14 00:46:49
2012
bulach
2012/02/14 02:12:32
:)
done.
|
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +package com.android.example.jni_generator; |
|
joth
2012/02/14 00:46:49
may as well be org.chromium...
bulach
2012/02/14 02:12:32
Done.
|
| + |
| +// 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 |
|
joth
2012/02/14 00:46:49
note to anyone else reading this: .java files have
|
| + // 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); |
| + |
| + } |
| +} |