Chromium Code Reviews| 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); |