|  | // Copyright (c) 2013 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. | 
|  |  | 
|  | #ifndef BASE_ANDROID_JNI_GENERATOR_SAMPLE_FOR_TESTS_H_ | 
|  | #define BASE_ANDROID_JNI_GENERATOR_SAMPLE_FOR_TESTS_H_ | 
|  |  | 
|  | #include <jni.h> | 
|  | #include <map> | 
|  | #include <string> | 
|  |  | 
|  | #include "base/android/jni_android.h" | 
|  | #include "starboard/types.h" | 
|  |  | 
|  | namespace base { | 
|  | namespace android { | 
|  |  | 
|  | // This file is used to: | 
|  | // - document the best practices and guidelines on JNI usage. | 
|  | // - ensure sample_for_tests_jni.h compiles and the functions declared in it | 
|  | // as expected. | 
|  | // | 
|  | // Methods are called directly from Java. More documentation in | 
|  | // SampleForTests.java. See BUILD.gn for the build rules necessary for JNI | 
|  | // to be used in an APK. | 
|  | // | 
|  | // For C++ to access Java methods: | 
|  | // - GN Build must be configured to generate bindings: | 
|  | //  # Add import at top of file: | 
|  | //  if (is_android) { | 
|  | //    import("//build/config/android/rules.gni")  # For generate_jni(). | 
|  | //  } | 
|  | //  # ... | 
|  | //  # An example target that will rely on JNI: | 
|  | //  component("foo") { | 
|  | //    # ... normal sources, defines, deps. | 
|  | //    #     For each jni generated .java -> .h header file in jni_headers | 
|  | //    #     target there will be a single .cc file here that includes it. | 
|  | //    # | 
|  | //    # Add a dep for JNI: | 
|  | //    if (is_android) { | 
|  | //      deps += [ ":foo_jni" ] | 
|  | //    } | 
|  | //  } | 
|  | //  # ... | 
|  | //  # Create target for JNI: | 
|  | //  if (is_android) { | 
|  | //    generate_jni("jni_headers") { | 
|  | //      sources = [ | 
|  | //        "java/src/org/chromium/example/jni_generator/SampleForTests.java", | 
|  | //      ] | 
|  | //      jni_package = "foo" | 
|  | //    } | 
|  | //    android_library("java") { | 
|  | //      java_files = [ | 
|  | //        "java/src/org/chromium/example/jni_generator/SampleForTests.java", | 
|  | //        "java/src/org/chromium/example/jni_generator/NonJniFile.java", | 
|  | //      ] | 
|  | //    } | 
|  | //  } | 
|  | // The build rules above are generally that that's needed when adding new | 
|  | // JNI methods/files. For a full GN example, see | 
|  | // base/android/jni_generator/BUILD.gn | 
|  | // | 
|  | // For C++ methods to be exposed to Java: | 
|  | // - The Java class must be part of an android_apk target that depends on | 
|  | //   a generate_jni_registration target. This generate_jni_registration target | 
|  | //   automatically generates all necessary registration functions. The | 
|  | //   generated header file exposes two functions that should be called when a | 
|  | //   library is first loaded: | 
|  | //     1) RegisterMainDexNatives() | 
|  | //       - Registers all methods that are used outside the browser process | 
|  | //     2) RegisterNonMainDexNatives() | 
|  | //       - Registers all methods used in the browser process | 
|  | // | 
|  | class CPPClass { | 
|  | public: | 
|  | CPPClass(); | 
|  | ~CPPClass(); | 
|  |  | 
|  | // Java @CalledByNative methods implicitly available to C++ via the _jni.h | 
|  | // file included in the .cc file. | 
|  |  | 
|  | class InnerClass { | 
|  | public: | 
|  | jdouble MethodOtherP0(JNIEnv* env, | 
|  | const base::android::JavaParamRef<jobject>& caller); | 
|  | }; | 
|  |  | 
|  | void Destroy(JNIEnv* env, const base::android::JavaParamRef<jobject>& caller); | 
|  |  | 
|  | jint Method(JNIEnv* env, const base::android::JavaParamRef<jobject>& caller); | 
|  |  | 
|  | void AddStructB(JNIEnv* env, | 
|  | const base::android::JavaParamRef<jobject>& caller, | 
|  | const base::android::JavaParamRef<jobject>& structb); | 
|  |  | 
|  | void IterateAndDoSomethingWithStructB( | 
|  | JNIEnv* env, | 
|  | const base::android::JavaParamRef<jobject>& caller); | 
|  |  | 
|  | base::android::ScopedJavaLocalRef<jstring> ReturnAString( | 
|  | JNIEnv* env, | 
|  | const base::android::JavaParamRef<jobject>& caller); | 
|  |  | 
|  | private: | 
|  | std::map<long, std::string> map_; | 
|  |  | 
|  | DISALLOW_COPY_AND_ASSIGN(CPPClass); | 
|  | }; | 
|  |  | 
|  | }  // namespace android | 
|  | }  // namespace base | 
|  |  | 
|  | #endif  // BASE_ANDROID_JNI_GENERATOR_SAMPLE_FOR_TESTS_H_ |