Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3530)

Unified Diff: base/android/jni_generator/sample_for_tests.h

Issue 1123343005: Improve jni_generator sample documentation. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: addressed comments Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: base/android/jni_generator/sample_for_tests.h
diff --git a/base/android/jni_generator/sample_for_tests.h b/base/android/jni_generator/sample_for_tests.h
index c98cf97693638963a322c3fd582bb7f541f526b1..58f106af3697233181ff75ad0eddc4d94d4aff47 100644
--- a/base/android/jni_generator/sample_for_tests.h
+++ b/base/android/jni_generator/sample_for_tests.h
@@ -20,13 +20,119 @@ namespace android {
// - ensure sample_for_tests_jni.h compiles and the functions declared in it
// as expected.
//
-// All methods are called directly from Java. See more documentation in
-// SampleForTests.java.
+// Methods are called directly from Java (except RegisterJNI). More
+// documentation in SampleForTests.java
+//
+// For C++ to access Java methods:
+// - GYP Build must be configured to generate bindings:
+// # ...
+// 'targets': [
+// {
+// # An example target that will rely on JNI:
+// 'target_name': 'base_jni_generator_sample',
cjhopman 2015/05/20 02:28:27 I'd probably do s/base_jni_generator/foo/ througho
cjhopman 2015/05/20 02:28:27 add a 'type': 'static_library' (or shared/componen
scheib 2015/05/20 22:12:06 Done.
scheib 2015/05/20 22:12:06 Done.
+// # ... normal sources, defines, deps.
+// # Add deps for JNI:
+// 'conditions': [
+// ['OS == "android"', {
+// 'dependencies': [
+// 'base_jni_generator_sample_java',
nyquist 2015/05/14 00:31:13 I don't think we should suggest depending on both
scheib 2015/05/14 02:14:47 By demonstration, I have the device/bluetooth targ
nyquist 2015/05/14 17:01:01 C++ target at compile time only need _jni_headers.
scheib 2015/05/14 17:11:27 That seems consistent with "C++ target requires _j
+// 'base_jni_generator_sample_jni_headers',
+// ],
+// }],
+// ],
+// },
+// ],
+// # ...
+// # Create targets for JNI:
+// 'conditions': [
+// ['OS == "android"', {
+// 'targets': [
+// {
+// 'target_name': 'base_jni_generator_sample_jni_headers',
+// 'type': 'none',
+// 'sources': [
+// 'java/src/org/chromium/example/jni_generator/SampleForTests.java',
+// ],
+// 'variables': {
+// 'jni_gen_package': 'base_jni_generator_sample',
+// },
+// 'includes': [ '../../../build/jni_generator.gypi' ],
+// },
+// {
+// 'target_name': 'base_jni_generator_sample_java',
+// 'type': 'none',
+// 'dependencies': [
+// '../../../base/base.gyp:base',
+// ],
+// 'variables': {
+// 'java_in_dir': 'java',
+// },
+// 'includes': [ '../../../build/java.gypi' ],
+// },
+// ],
+// }],
+// ],
+//
+// - 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("base_jni_generator_sample") {
+// # ... normal sources, defines, deps.
nyquist 2015/05/14 00:31:13 Mention that herein lies the one and only .cc file
scheib 2015/05/20 22:12:06 Done.
+// # Add a dep for JNI:
+// if (is_android) {
+// deps += [ ":base_jni_generator_sample_jni" ]
+// }
+// }
+// # ...
+// # Create target for JNI:
+// if (is_android) {
+// generate_jni("base_jni_generator_sample_jni") {
+// sources = [
+// "java/src/org/chromium/example/jni_generator/SampleForTests.java",
+// ]
+// jni_package = "base_jni_generator_sample"
+// }
cjhopman 2015/05/20 02:28:27 add: android_library("base_jni_generator_sample_ja
scheib 2015/05/20 22:12:06 Done.
+// }
+//
+// 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 is then called by a larger module,
cjhopman 2015/05/20 02:28:27 I'd do s/is then called/must be called/ to make it
scheib 2015/05/20 22:12:06 Done.
+// 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, jobject obj);

Powered by Google App Engine
This is Rietveld 408576698