1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
|
// 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"
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 (except RegisterJNI). More
// documentation in SampleForTests.java
//
// 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",
// ]
// }
// }
//
// For C++ methods to be exposed to Java:
// - The generated RegisterNativesImpl method must be called, this is typically
// done by having a static RegisterJNI method in the C++ class.
// - The RegisterJNI method is added to a module's collection of register
// methods, such as: example_jni_registrar.h/cc files which call
// base::android::RegisterNativeMethods.
// An example_jni_registstrar.cc:
//
// namespace {
// const base::android::RegistrationMethod kRegisteredMethods[] = {
// // Initial string is for debugging only.
// { "ExampleName", base::ExampleNameAndroid::RegisterJNI },
// { "ExampleName2", base::ExampleName2Android::RegisterJNI },
// };
// } // namespace
//
// bool RegisterModuleNameJni(JNIEnv* env) {
// return RegisterNativeMethods(env, kRegisteredMethods,
// arraysize(kRegisteredMethods));
// }
//
// - Each module's RegisterModuleNameJni must be called by a larger module,
// or application during startup.
//
class CPPClass {
public:
CPPClass();
~CPPClass();
// Register C++ methods exposed to Java using JNI.
static bool RegisterJNI(JNIEnv* env);
// 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_
|