Commit 1b58f8f7 authored by mkosiba@chromium.org's avatar mkosiba@chromium.org

Make class lookup lazy in jni_generator when using lazy method lookup.

This removes the eager class registration from RegisterNatives when possible.

BUG=402003
TBR=sievers@chromium.org, brettw@chromium.org

Review URL: https://codereview.chromium.org/472553002

Cr-Commit-Position: refs/heads/master@{#290810}
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@290810 0039d316-1c4b-4281-b951-d872f2087c98
parent 40cae850
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
#include "android_webview/native/android_webview_jni_registrar.h" #include "android_webview/native/android_webview_jni_registrar.h"
#include "base/android/jni_android.h" #include "base/android/jni_android.h"
#include "base/android/jni_registrar.h" #include "base/android/jni_registrar.h"
#include "base/android/jni_utils.h"
#include "base/android/library_loader/library_loader_hooks.h" #include "base/android/library_loader/library_loader_hooks.h"
#include "components/navigation_interception/component_jni_registrar.h" #include "components/navigation_interception/component_jni_registrar.h"
#include "components/web_contents_delegate_android/component_jni_registrar.h" #include "components/web_contents_delegate_android/component_jni_registrar.h"
...@@ -47,6 +48,9 @@ JNI_EXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved) { ...@@ -47,6 +48,9 @@ JNI_EXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved) {
if (!android_webview::RegisterJni(env)) if (!android_webview::RegisterJni(env))
return -1; return -1;
base::android::InitReplacementClassLoader(env,
base::android::GetClassLoader(env));
content::SetContentMainDelegate(new android_webview::AwMainDelegate()); content::SetContentMainDelegate(new android_webview::AwMainDelegate());
// Initialize url lib here while we are still single-threaded, in case we use // Initialize url lib here while we are still single-threaded, in case we use
......
...@@ -49,6 +49,8 @@ component("base") { ...@@ -49,6 +49,8 @@ component("base") {
"android/jni_registrar.h", "android/jni_registrar.h",
"android/jni_string.cc", "android/jni_string.cc",
"android/jni_string.h", "android/jni_string.h",
"android/jni_utils.cc",
"android/jni_utils.h",
"android/jni_weak_ref.cc", "android/jni_weak_ref.cc",
"android/jni_weak_ref.h", "android/jni_weak_ref.h",
"android/library_loader/library_loader_hooks.cc", "android/library_loader/library_loader_hooks.cc",
...@@ -1343,6 +1345,7 @@ if (is_android) { ...@@ -1343,6 +1345,7 @@ if (is_android) {
"android/java/src/org/chromium/base/EventLog.java", "android/java/src/org/chromium/base/EventLog.java",
"android/java/src/org/chromium/base/FieldTrialList.java", "android/java/src/org/chromium/base/FieldTrialList.java",
"android/java/src/org/chromium/base/ImportantFileWriterAndroid.java", "android/java/src/org/chromium/base/ImportantFileWriterAndroid.java",
"android/java/src/org/chromium/base/JNIUtils.java",
"android/java/src/org/chromium/base/library_loader/LibraryLoader.java", "android/java/src/org/chromium/base/library_loader/LibraryLoader.java",
"android/java/src/org/chromium/base/MemoryPressureListener.java", "android/java/src/org/chromium/base/MemoryPressureListener.java",
"android/java/src/org/chromium/base/JavaHandlerThread.java", "android/java/src/org/chromium/base/JavaHandlerThread.java",
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#include "base/android/java_handler_thread.h" #include "base/android/java_handler_thread.h"
#include "base/android/jni_android.h" #include "base/android/jni_android.h"
#include "base/android/jni_registrar.h" #include "base/android/jni_registrar.h"
#include "base/android/jni_utils.h"
#include "base/android/memory_pressure_listener_android.h" #include "base/android/memory_pressure_listener_android.h"
#include "base/android/path_service_android.h" #include "base/android/path_service_android.h"
#include "base/android/path_utils.h" #include "base/android/path_utils.h"
...@@ -40,6 +41,7 @@ static RegistrationMethod kBaseRegisteredMethods[] = { ...@@ -40,6 +41,7 @@ static RegistrationMethod kBaseRegisteredMethods[] = {
{ "FieldTrialList", base::android::RegisterFieldTrialList }, { "FieldTrialList", base::android::RegisterFieldTrialList },
{ "ImportantFileWriterAndroid", { "ImportantFileWriterAndroid",
base::android::RegisterImportantFileWriterAndroid }, base::android::RegisterImportantFileWriterAndroid },
{ "JNIUtils", base::android::RegisterJNIUtils },
{ "MemoryPressureListenerAndroid", { "MemoryPressureListenerAndroid",
base::android::MemoryPressureListenerAndroid::Register }, base::android::MemoryPressureListenerAndroid::Register },
{ "JavaHandlerThread", base::android::JavaHandlerThread::RegisterBindings }, { "JavaHandlerThread", base::android::JavaHandlerThread::RegisterBindings },
......
// Copyright 2014 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.
package org.chromium.base;
/**
* This class provides JNI-related methods to the native library.
*/
public class JNIUtils {
/**
* This returns a ClassLoader that is capable of loading Chromium Java code. Such a ClassLoader
* is needed for the few cases where the JNI mechanism is unable to automatically determine the
* appropriate ClassLoader instance.
*/
@CalledByNative
public static Object getClassLoader() {
return JNIUtils.class.getClassLoader();
}
}
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include "base/android/build_info.h" #include "base/android/build_info.h"
#include "base/android/jni_string.h" #include "base/android/jni_string.h"
#include "base/android/jni_utils.h"
#include "base/lazy_instance.h" #include "base/lazy_instance.h"
#include "base/logging.h" #include "base/logging.h"
...@@ -21,6 +22,9 @@ JavaVM* g_jvm = NULL; ...@@ -21,6 +22,9 @@ JavaVM* g_jvm = NULL;
// that may still be running at shutdown. There is no harm in doing this. // that may still be running at shutdown. There is no harm in doing this.
base::LazyInstance<base::android::ScopedJavaGlobalRef<jobject> >::Leaky base::LazyInstance<base::android::ScopedJavaGlobalRef<jobject> >::Leaky
g_application_context = LAZY_INSTANCE_INITIALIZER; g_application_context = LAZY_INSTANCE_INITIALIZER;
base::LazyInstance<base::android::ScopedJavaGlobalRef<jobject> >::Leaky
g_class_loader = LAZY_INSTANCE_INITIALIZER;
jmethodID g_class_loader_load_class_method_id = 0;
std::string GetJavaExceptionInfo(JNIEnv* env, jthrowable java_throwable) { std::string GetJavaExceptionInfo(JNIEnv* env, jthrowable java_throwable) {
ScopedJavaLocalRef<jclass> throwable_clazz = ScopedJavaLocalRef<jclass> throwable_clazz =
...@@ -118,17 +122,68 @@ void InitApplicationContext(JNIEnv* env, const JavaRef<jobject>& context) { ...@@ -118,17 +122,68 @@ void InitApplicationContext(JNIEnv* env, const JavaRef<jobject>& context) {
g_application_context.Get().Reset(context); g_application_context.Get().Reset(context);
} }
void InitReplacementClassLoader(JNIEnv* env,
const JavaRef<jobject>& class_loader) {
DCHECK(g_class_loader.Get().is_null());
DCHECK(!class_loader.is_null());
ScopedJavaLocalRef<jclass> class_loader_clazz =
GetClass(env, "java/lang/ClassLoader");
CHECK(!ClearException(env));
g_class_loader_load_class_method_id =
env->GetMethodID(class_loader_clazz.obj(),
"loadClass",
"(Ljava/lang/String;)Ljava/lang/Class;");
CHECK(!ClearException(env));
DCHECK(env->IsInstanceOf(class_loader.obj(), class_loader_clazz.obj()));
g_class_loader.Get().Reset(class_loader);
}
const jobject GetApplicationContext() { const jobject GetApplicationContext() {
DCHECK(!g_application_context.Get().is_null()); DCHECK(!g_application_context.Get().is_null());
return g_application_context.Get().obj(); return g_application_context.Get().obj();
} }
ScopedJavaLocalRef<jclass> GetClass(JNIEnv* env, const char* class_name) { ScopedJavaLocalRef<jclass> GetClass(JNIEnv* env, const char* class_name) {
jclass clazz = env->FindClass(class_name); jclass clazz;
if (!g_class_loader.Get().is_null()) {
clazz = static_cast<jclass>(
env->CallObjectMethod(g_class_loader.Get().obj(),
g_class_loader_load_class_method_id,
ConvertUTF8ToJavaString(env, class_name).obj()));
} else {
clazz = env->FindClass(class_name);
}
CHECK(!ClearException(env) && clazz) << "Failed to find class " << class_name; CHECK(!ClearException(env) && clazz) << "Failed to find class " << class_name;
return ScopedJavaLocalRef<jclass>(env, clazz); return ScopedJavaLocalRef<jclass>(env, clazz);
} }
jclass LazyGetClass(
JNIEnv* env,
const char* class_name,
base::subtle::AtomicWord* atomic_class_id) {
COMPILE_ASSERT(sizeof(subtle::AtomicWord) >= sizeof(jclass),
AtomicWord_SmallerThan_jMethodID);
subtle::AtomicWord value = base::subtle::Acquire_Load(atomic_class_id);
if (value)
return reinterpret_cast<jclass>(value);
ScopedJavaGlobalRef<jclass> clazz;
clazz.Reset(GetClass(env, class_name));
subtle::AtomicWord null_aw = reinterpret_cast<subtle::AtomicWord>(NULL);
subtle::AtomicWord cas_result = base::subtle::Release_CompareAndSwap(
atomic_class_id,
null_aw,
reinterpret_cast<subtle::AtomicWord>(clazz.obj()));
if (cas_result == null_aw) {
// We intentionally leak the global ref since we now storing it as a raw
// pointer in |atomic_class_id|.
return clazz.Release();
} else {
return reinterpret_cast<jclass>(cas_result);
}
}
template<MethodID::Type type> template<MethodID::Type type>
jmethodID MethodID::Get(JNIEnv* env, jmethodID MethodID::Get(JNIEnv* env,
jclass clazz, jclass clazz,
......
...@@ -53,6 +53,15 @@ BASE_EXPORT bool IsVMInitialized(); ...@@ -53,6 +53,15 @@ BASE_EXPORT bool IsVMInitialized();
BASE_EXPORT void InitApplicationContext(JNIEnv* env, BASE_EXPORT void InitApplicationContext(JNIEnv* env,
const JavaRef<jobject>& context); const JavaRef<jobject>& context);
// Initializes the global ClassLoader used by the GetClass and LazyGetClass
// methods. This is needed because JNI will use the base ClassLoader when there
// is no Java code on the stack. The base ClassLoader doesn't know about any of
// the application classes and will fail to lookup anything other than system
// classes.
BASE_EXPORT void InitReplacementClassLoader(
JNIEnv* env,
const JavaRef<jobject>& class_loader);
// Gets a global ref to the application context set with // Gets a global ref to the application context set with
// InitApplicationContext(). Ownership is retained by the function - the caller // InitApplicationContext(). Ownership is retained by the function - the caller
// must NOT release it. // must NOT release it.
...@@ -66,6 +75,17 @@ const BASE_EXPORT jobject GetApplicationContext(); ...@@ -66,6 +75,17 @@ const BASE_EXPORT jobject GetApplicationContext();
BASE_EXPORT ScopedJavaLocalRef<jclass> GetClass(JNIEnv* env, BASE_EXPORT ScopedJavaLocalRef<jclass> GetClass(JNIEnv* env,
const char* class_name); const char* class_name);
// The method will initialize |atomic_class_id| to contain a global ref to the
// class. And will return that ref on subsequent calls. It's the caller's
// responsibility to release the ref when it is no longer needed.
// The caller is responsible to zero-initialize |atomic_method_id|.
// It's fine to simultaneously call this on multiple threads referencing the
// same |atomic_method_id|.
BASE_EXPORT jclass LazyGetClass(
JNIEnv* env,
const char* class_name,
base::subtle::AtomicWord* atomic_class_id);
// This class is a wrapper for JNIEnv Get(Static)MethodID. // This class is a wrapper for JNIEnv Get(Static)MethodID.
class BASE_EXPORT MethodID { class BASE_EXPORT MethodID {
public: public:
......
// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
...@@ -24,12 +24,22 @@ const char kSampleForTestsClassPath[] = ...@@ -24,12 +24,22 @@ const char kSampleForTestsClassPath[] =
"org/chromium/example/jni_generator/SampleForTests"; "org/chromium/example/jni_generator/SampleForTests";
const char kInnerStructBClassPath[] = const char kInnerStructBClassPath[] =
"org/chromium/example/jni_generator/SampleForTests$InnerStructB"; "org/chromium/example/jni_generator/SampleForTests$InnerStructB";
#if __clang__
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-function"
#endif
// Leaking this jclass as we cannot use LazyInstance from some threads. // Leaking this jclass as we cannot use LazyInstance from some threads.
jclass g_InnerStructA_clazz = NULL; jclass g_InnerStructA_clazz = NULL;
jclass InnerStructA_clazz(JNIEnv*) { return g_InnerStructA_clazz; }
// Leaking this jclass as we cannot use LazyInstance from some threads. // Leaking this jclass as we cannot use LazyInstance from some threads.
jclass g_SampleForTests_clazz = NULL; jclass g_SampleForTests_clazz = NULL;
jclass SampleForTests_clazz(JNIEnv*) { return g_SampleForTests_clazz; }
// Leaking this jclass as we cannot use LazyInstance from some threads. // Leaking this jclass as we cannot use LazyInstance from some threads.
jclass g_InnerStructB_clazz = NULL; jclass g_InnerStructB_clazz = NULL;
jclass InnerStructB_clazz(JNIEnv*) { return g_InnerStructB_clazz; }
#if __clang__
#pragma clang diagnostic pop
#endif
} // namespace } // namespace
...@@ -99,11 +109,11 @@ static jint Java_SampleForTests_javaMethod(JNIEnv* env, jobject obj, ...@@ -99,11 +109,11 @@ static jint Java_SampleForTests_javaMethod(JNIEnv* env, jobject obj,
JniIntWrapper bar) { JniIntWrapper bar) {
/* Must call RegisterNativesImpl() */ /* Must call RegisterNativesImpl() */
CHECK_CLAZZ(env, obj, CHECK_CLAZZ(env, obj,
g_SampleForTests_clazz, 0); SampleForTests_clazz(env), 0);
jmethodID method_id = jmethodID method_id =
base::android::MethodID::LazyGet< base::android::MethodID::LazyGet<
base::android::MethodID::TYPE_INSTANCE>( base::android::MethodID::TYPE_INSTANCE>(
env, g_SampleForTests_clazz, env, SampleForTests_clazz(env),
"javaMethod", "javaMethod",
"(" "("
...@@ -123,12 +133,12 @@ static jint Java_SampleForTests_javaMethod(JNIEnv* env, jobject obj, ...@@ -123,12 +133,12 @@ static jint Java_SampleForTests_javaMethod(JNIEnv* env, jobject obj,
static base::subtle::AtomicWord g_SampleForTests_staticJavaMethod = 0; static base::subtle::AtomicWord g_SampleForTests_staticJavaMethod = 0;
static jboolean Java_SampleForTests_staticJavaMethod(JNIEnv* env) { static jboolean Java_SampleForTests_staticJavaMethod(JNIEnv* env) {
/* Must call RegisterNativesImpl() */ /* Must call RegisterNativesImpl() */
CHECK_CLAZZ(env, g_SampleForTests_clazz, CHECK_CLAZZ(env, SampleForTests_clazz(env),
g_SampleForTests_clazz, false); SampleForTests_clazz(env), false);
jmethodID method_id = jmethodID method_id =
base::android::MethodID::LazyGet< base::android::MethodID::LazyGet<
base::android::MethodID::TYPE_STATIC>( base::android::MethodID::TYPE_STATIC>(
env, g_SampleForTests_clazz, env, SampleForTests_clazz(env),
"staticJavaMethod", "staticJavaMethod",
"(" "("
...@@ -137,7 +147,7 @@ static jboolean Java_SampleForTests_staticJavaMethod(JNIEnv* env) { ...@@ -137,7 +147,7 @@ static jboolean Java_SampleForTests_staticJavaMethod(JNIEnv* env) {
&g_SampleForTests_staticJavaMethod); &g_SampleForTests_staticJavaMethod);
jboolean ret = jboolean ret =
env->CallStaticBooleanMethod(g_SampleForTests_clazz, env->CallStaticBooleanMethod(SampleForTests_clazz(env),
method_id); method_id);
jni_generator::CheckException(env); jni_generator::CheckException(env);
return ret; return ret;
...@@ -148,11 +158,11 @@ static void Java_SampleForTests_packagePrivateJavaMethod(JNIEnv* env, jobject ...@@ -148,11 +158,11 @@ static void Java_SampleForTests_packagePrivateJavaMethod(JNIEnv* env, jobject
obj) { obj) {
/* Must call RegisterNativesImpl() */ /* Must call RegisterNativesImpl() */
CHECK_CLAZZ(env, obj, CHECK_CLAZZ(env, obj,
g_SampleForTests_clazz); SampleForTests_clazz(env));
jmethodID method_id = jmethodID method_id =
base::android::MethodID::LazyGet< base::android::MethodID::LazyGet<
base::android::MethodID::TYPE_INSTANCE>( base::android::MethodID::TYPE_INSTANCE>(
env, g_SampleForTests_clazz, env, SampleForTests_clazz(env),
"packagePrivateJavaMethod", "packagePrivateJavaMethod",
"(" "("
...@@ -171,11 +181,11 @@ static void Java_SampleForTests_methodThatThrowsException(JNIEnv* env, jobject ...@@ -171,11 +181,11 @@ static void Java_SampleForTests_methodThatThrowsException(JNIEnv* env, jobject
obj) { obj) {
/* Must call RegisterNativesImpl() */ /* Must call RegisterNativesImpl() */
CHECK_CLAZZ(env, obj, CHECK_CLAZZ(env, obj,
g_SampleForTests_clazz); SampleForTests_clazz(env));
jmethodID method_id = jmethodID method_id =
base::android::MethodID::LazyGet< base::android::MethodID::LazyGet<
base::android::MethodID::TYPE_INSTANCE>( base::android::MethodID::TYPE_INSTANCE>(
env, g_SampleForTests_clazz, env, SampleForTests_clazz(env),
"methodThatThrowsException", "methodThatThrowsException",
"(" "("
...@@ -194,12 +204,12 @@ static base::android::ScopedJavaLocalRef<jobject> ...@@ -194,12 +204,12 @@ static base::android::ScopedJavaLocalRef<jobject>
JniIntWrapper i, JniIntWrapper i,
jstring s) { jstring s) {
/* Must call RegisterNativesImpl() */ /* Must call RegisterNativesImpl() */
CHECK_CLAZZ(env, g_InnerStructA_clazz, CHECK_CLAZZ(env, InnerStructA_clazz(env),
g_InnerStructA_clazz, NULL); InnerStructA_clazz(env), NULL);
jmethodID method_id = jmethodID method_id =
base::android::MethodID::LazyGet< base::android::MethodID::LazyGet<
base::android::MethodID::TYPE_STATIC>( base::android::MethodID::TYPE_STATIC>(
env, g_InnerStructA_clazz, env, InnerStructA_clazz(env),
"create", "create",
"(" "("
...@@ -211,7 +221,7 @@ static base::android::ScopedJavaLocalRef<jobject> ...@@ -211,7 +221,7 @@ static base::android::ScopedJavaLocalRef<jobject>
&g_InnerStructA_create); &g_InnerStructA_create);
jobject ret = jobject ret =
env->CallStaticObjectMethod(g_InnerStructA_clazz, env->CallStaticObjectMethod(InnerStructA_clazz(env),
method_id, l, as_jint(i), s); method_id, l, as_jint(i), s);
jni_generator::CheckException(env); jni_generator::CheckException(env);
return base::android::ScopedJavaLocalRef<jobject>(env, ret); return base::android::ScopedJavaLocalRef<jobject>(env, ret);
...@@ -222,11 +232,11 @@ static void Java_SampleForTests_addStructA(JNIEnv* env, jobject obj, jobject a) ...@@ -222,11 +232,11 @@ static void Java_SampleForTests_addStructA(JNIEnv* env, jobject obj, jobject a)
{ {
/* Must call RegisterNativesImpl() */ /* Must call RegisterNativesImpl() */
CHECK_CLAZZ(env, obj, CHECK_CLAZZ(env, obj,
g_SampleForTests_clazz); SampleForTests_clazz(env));
jmethodID method_id = jmethodID method_id =
base::android::MethodID::LazyGet< base::android::MethodID::LazyGet<
base::android::MethodID::TYPE_INSTANCE>( base::android::MethodID::TYPE_INSTANCE>(
env, g_SampleForTests_clazz, env, SampleForTests_clazz(env),
"addStructA", "addStructA",
"(" "("
...@@ -246,11 +256,11 @@ static void Java_SampleForTests_iterateAndDoSomething(JNIEnv* env, jobject obj) ...@@ -246,11 +256,11 @@ static void Java_SampleForTests_iterateAndDoSomething(JNIEnv* env, jobject obj)
{ {
/* Must call RegisterNativesImpl() */ /* Must call RegisterNativesImpl() */
CHECK_CLAZZ(env, obj, CHECK_CLAZZ(env, obj,
g_SampleForTests_clazz); SampleForTests_clazz(env));
jmethodID method_id = jmethodID method_id =
base::android::MethodID::LazyGet< base::android::MethodID::LazyGet<
base::android::MethodID::TYPE_INSTANCE>( base::android::MethodID::TYPE_INSTANCE>(
env, g_SampleForTests_clazz, env, SampleForTests_clazz(env),
"iterateAndDoSomething", "iterateAndDoSomething",
"(" "("
...@@ -268,11 +278,11 @@ static base::subtle::AtomicWord g_InnerStructB_getKey = 0; ...@@ -268,11 +278,11 @@ static base::subtle::AtomicWord g_InnerStructB_getKey = 0;
static jlong Java_InnerStructB_getKey(JNIEnv* env, jobject obj) { static jlong Java_InnerStructB_getKey(JNIEnv* env, jobject obj) {
/* Must call RegisterNativesImpl() */ /* Must call RegisterNativesImpl() */
CHECK_CLAZZ(env, obj, CHECK_CLAZZ(env, obj,
g_InnerStructB_clazz, 0); InnerStructB_clazz(env), 0);
jmethodID method_id = jmethodID method_id =
base::android::MethodID::LazyGet< base::android::MethodID::LazyGet<
base::android::MethodID::TYPE_INSTANCE>( base::android::MethodID::TYPE_INSTANCE>(
env, g_InnerStructB_clazz, env, InnerStructB_clazz(env),
"getKey", "getKey",
"(" "("
...@@ -292,11 +302,11 @@ static base::android::ScopedJavaLocalRef<jstring> ...@@ -292,11 +302,11 @@ static base::android::ScopedJavaLocalRef<jstring>
Java_InnerStructB_getValue(JNIEnv* env, jobject obj) { Java_InnerStructB_getValue(JNIEnv* env, jobject obj) {
/* Must call RegisterNativesImpl() */ /* Must call RegisterNativesImpl() */
CHECK_CLAZZ(env, obj, CHECK_CLAZZ(env, obj,
g_InnerStructB_clazz, NULL); InnerStructB_clazz(env), NULL);
jmethodID method_id = jmethodID method_id =
base::android::MethodID::LazyGet< base::android::MethodID::LazyGet<
base::android::MethodID::TYPE_INSTANCE>( base::android::MethodID::TYPE_INSTANCE>(
env, g_InnerStructB_clazz, env, InnerStructB_clazz(env),
"getValue", "getValue",
"(" "("
...@@ -379,11 +389,11 @@ static bool RegisterNativesImpl(JNIEnv* env) { ...@@ -379,11 +389,11 @@ static bool RegisterNativesImpl(JNIEnv* env) {
const int kMethodsSampleForTestsSize = arraysize(kMethodsSampleForTests); const int kMethodsSampleForTestsSize = arraysize(kMethodsSampleForTests);
if (env->RegisterNatives(g_SampleForTests_clazz, if (env->RegisterNatives(SampleForTests_clazz(env),
kMethodsSampleForTests, kMethodsSampleForTests,
kMethodsSampleForTestsSize) < 0) { kMethodsSampleForTestsSize) < 0) {
jni_generator::HandleRegistrationError( jni_generator::HandleRegistrationError(
env, g_SampleForTests_clazz, __FILE__); env, SampleForTests_clazz(env), __FILE__);
return false; return false;
} }
......
...@@ -731,7 +731,7 @@ class InlHeaderFileGenerator(object): ...@@ -731,7 +731,7 @@ class InlHeaderFileGenerator(object):
def GetContent(self): def GetContent(self):
"""Returns the content of the JNI binding file.""" """Returns the content of the JNI binding file."""
template = Template("""\ template = Template("""\
// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
...@@ -947,11 +947,11 @@ ${CALLED_BY_NATIVES} ...@@ -947,11 +947,11 @@ ${CALLED_BY_NATIVES}
template = Template("""\ template = Template("""\
const int kMethods${JAVA_CLASS}Size = arraysize(kMethods${JAVA_CLASS}); const int kMethods${JAVA_CLASS}Size = arraysize(kMethods${JAVA_CLASS});
if (env->RegisterNatives(g_${JAVA_CLASS}_clazz, if (env->RegisterNatives(${JAVA_CLASS}_clazz(env),
kMethods${JAVA_CLASS}, kMethods${JAVA_CLASS},
kMethods${JAVA_CLASS}Size) < 0) { kMethods${JAVA_CLASS}Size) < 0) {
jni_generator::HandleRegistrationError( jni_generator::HandleRegistrationError(
env, g_${JAVA_CLASS}_clazz, __FILE__); env, ${JAVA_CLASS}_clazz(env), __FILE__);
return false; return false;
} }
""") """)
...@@ -1122,11 +1122,10 @@ static ${RETURN} ${NAME}(JNIEnv* env, ${PARAMS_IN_DECLARATION}) {""" ...@@ -1122,11 +1122,10 @@ static ${RETURN} ${NAME}(JNIEnv* env, ${PARAMS_IN_DECLARATION}) {"""
def GetCalledByNativeValues(self, called_by_native): def GetCalledByNativeValues(self, called_by_native):
"""Fills in necessary values for the CalledByNative methods.""" """Fills in necessary values for the CalledByNative methods."""
java_class = called_by_native.java_class_name or self.class_name
if called_by_native.static or called_by_native.is_constructor: if called_by_native.static or called_by_native.is_constructor:
first_param_in_declaration = '' first_param_in_declaration = ''
first_param_in_call = ('g_%s_clazz' % first_param_in_call = ('%s_clazz(env)' % java_class)
(called_by_native.java_class_name or
self.class_name))
else: else:
first_param_in_declaration = ', jobject obj' first_param_in_declaration = ', jobject obj'
first_param_in_call = 'obj' first_param_in_call = 'obj'
...@@ -1160,7 +1159,7 @@ static ${RETURN} ${NAME}(JNIEnv* env, ${PARAMS_IN_DECLARATION}) {""" ...@@ -1160,7 +1159,7 @@ static ${RETURN} ${NAME}(JNIEnv* env, ${PARAMS_IN_DECLARATION}) {"""
else: else:
return_clause = 'return ret;' return_clause = 'return ret;'
return { return {
'JAVA_CLASS': called_by_native.java_class_name or self.class_name, 'JAVA_CLASS': java_class,
'RETURN_TYPE': return_type, 'RETURN_TYPE': return_type,
'OPTIONAL_ERROR_RETURN': optional_error_return, 'OPTIONAL_ERROR_RETURN': optional_error_return,
'RETURN_DECLARATION': return_declaration, 'RETURN_DECLARATION': return_declaration,
...@@ -1204,7 +1203,7 @@ static base::subtle::AtomicWord g_${JAVA_CLASS}_${METHOD_ID_VAR_NAME} = 0; ...@@ -1204,7 +1203,7 @@ static base::subtle::AtomicWord g_${JAVA_CLASS}_${METHOD_ID_VAR_NAME} = 0;
${FUNCTION_HEADER} ${FUNCTION_HEADER}
/* Must call RegisterNativesImpl() */ /* Must call RegisterNativesImpl() */
CHECK_CLAZZ(env, ${FIRST_PARAM_IN_CALL}, CHECK_CLAZZ(env, ${FIRST_PARAM_IN_CALL},
g_${JAVA_CLASS}_clazz${OPTIONAL_ERROR_RETURN}); ${JAVA_CLASS}_clazz(env)${OPTIONAL_ERROR_RETURN});
jmethodID method_id = jmethodID method_id =
${GET_METHOD_ID_IMPL} ${GET_METHOD_ID_IMPL}
${RETURN_DECLARATION} ${RETURN_DECLARATION}
...@@ -1263,22 +1262,56 @@ const char k${JAVA_CLASS}ClassPath[] = "${JNI_CLASS_PATH}";""") ...@@ -1263,22 +1262,56 @@ const char k${JAVA_CLASS}ClassPath[] = "${JNI_CLASS_PATH}";""")
} }
ret += [template.substitute(values)] ret += [template.substitute(values)]
ret += '' ret += ''
for clazz in called_by_native_classes:
class_getter_methods = []
if self.options.native_exports:
template = Template("""\ template = Template("""\
// Leaking this jclass as we cannot use LazyInstance from some threads. // Leaking this jclass as we cannot use LazyInstance from some threads.
jclass g_${JAVA_CLASS}_clazz = NULL;""") base::subtle::AtomicWord g_${JAVA_CLASS}_clazz = 0;
jclass ${JAVA_CLASS}_clazz(JNIEnv* env) {
return base::android::LazyGetClass(env, k${JAVA_CLASS}ClassPath, \
&g_${JAVA_CLASS}_clazz);
}""")
else:
template = Template("""\
// Leaking this jclass as we cannot use LazyInstance from some threads.
jclass g_${JAVA_CLASS}_clazz = NULL;
jclass ${JAVA_CLASS}_clazz(JNIEnv*) { return g_${JAVA_CLASS}_clazz; }""")
for clazz in called_by_native_classes:
values = { values = {
'JAVA_CLASS': clazz, 'JAVA_CLASS': clazz,
} }
ret += [template.substitute(values)] class_getter_methods += [template.substitute(values)]
template = Template("""\
#if __clang__
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-function"
#endif
${CLASS_GETER_METHODS}
#if __clang__
#pragma clang diagnostic pop
#endif""")
values = {
'CLASS_GETER_METHODS': '\n'.join(class_getter_methods)
}
ret += [template.substitute(values)]
return '\n'.join(ret) return '\n'.join(ret)
def GetFindClasses(self): def GetFindClasses(self):
"""Returns the imlementation of FindClass for all known classes.""" """Returns the imlementation of FindClass for all known classes."""
if self.init_native: if self.init_native:
template = Template("""\ if self.options.native_exports:
template = Template("""\
base::subtle::Release_Store(&g_${JAVA_CLASS}_clazz,
static_cast<base::subtle::AtomicWord>(env->NewWeakGlobalRef(clazz));""")
else:
template = Template("""\
g_${JAVA_CLASS}_clazz = static_cast<jclass>(env->NewWeakGlobalRef(clazz));""") g_${JAVA_CLASS}_clazz = static_cast<jclass>(env->NewWeakGlobalRef(clazz));""")
else: else:
if self.options.native_exports:
return '\n'
template = Template("""\ template = Template("""\
g_${JAVA_CLASS}_clazz = reinterpret_cast<jclass>(env->NewGlobalRef( g_${JAVA_CLASS}_clazz = reinterpret_cast<jclass>(env->NewGlobalRef(
base::android::GetClass(env, k${JAVA_CLASS}ClassPath).obj()));""") base::android::GetClass(env, k${JAVA_CLASS}ClassPath).obj()));""")
...@@ -1293,13 +1326,13 @@ jclass g_${JAVA_CLASS}_clazz = NULL;""") ...@@ -1293,13 +1326,13 @@ jclass g_${JAVA_CLASS}_clazz = NULL;""")
if self.options.eager_called_by_natives: if self.options.eager_called_by_natives:
template = Template("""\ template = Template("""\
env->Get${STATIC_METHOD_PART}MethodID( env->Get${STATIC_METHOD_PART}MethodID(
g_${JAVA_CLASS}_clazz, ${JAVA_CLASS}_clazz(env),
"${JNI_NAME}", ${JNI_SIGNATURE});""") "${JNI_NAME}", ${JNI_SIGNATURE});""")
else: else:
template = Template("""\ template = Template("""\
base::android::MethodID::LazyGet< base::android::MethodID::LazyGet<
base::android::MethodID::TYPE_${STATIC}>( base::android::MethodID::TYPE_${STATIC}>(
env, g_${JAVA_CLASS}_clazz, env, ${JAVA_CLASS}_clazz(env),
"${JNI_NAME}", "${JNI_NAME}",
${JNI_SIGNATURE}, ${JNI_SIGNATURE},
&g_${JAVA_CLASS}_${METHOD_ID_VAR_NAME}); &g_${JAVA_CLASS}_${METHOD_ID_VAR_NAME});
......
// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
...@@ -19,8 +19,16 @@ ...@@ -19,8 +19,16 @@
// Step 1: forward declarations. // Step 1: forward declarations.
namespace { namespace {
const char kTestClassPath[] = "org/chromium/example/jni_generator/Test"; const char kTestClassPath[] = "org/chromium/example/jni_generator/Test";
#if __clang__
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-function"
#endif
// Leaking this jclass as we cannot use LazyInstance from some threads. // Leaking this jclass as we cannot use LazyInstance from some threads.
jclass g_Test_clazz = NULL; jclass g_Test_clazz = NULL;
jclass Test_clazz(JNIEnv*) { return g_Test_clazz; }
#if __clang__
#pragma clang diagnostic pop
#endif
jmethodID g_Test_testMethodWithParam = NULL; jmethodID g_Test_testMethodWithParam = NULL;
jmethodID g_Test_testStaticMethodWithParam = NULL; jmethodID g_Test_testStaticMethodWithParam = NULL;
jmethodID g_Test_testMethodWithNoParam = NULL; jmethodID g_Test_testMethodWithNoParam = NULL;
...@@ -46,20 +54,21 @@ static void testMethodWithParam(JNIEnv* env, jobject obj, JniIntWrapper iParam) ...@@ -46,20 +54,21 @@ static void testMethodWithParam(JNIEnv* env, jobject obj, JniIntWrapper iParam)
} }
static jint testStaticMethodWithParam(JNIEnv* env, JniIntWrapper iParam) { static jint testStaticMethodWithParam(JNIEnv* env, JniIntWrapper iParam) {
jint ret = env->CallStaticIntMethod(g_Test_clazz, jint ret = env->CallStaticIntMethod(Test_clazz(env),
g_Test_testStaticMethodWithParam, as_jint(iParam)); g_Test_testStaticMethodWithParam, as_jint(iParam));
return ret; return ret;
} }
static jdouble testMethodWithNoParam(JNIEnv* env) { static jdouble testMethodWithNoParam(JNIEnv* env) {
jdouble ret = env->CallStaticDoubleMethod(g_Test_clazz, jdouble ret = env->CallStaticDoubleMethod(Test_clazz(env),
g_Test_testMethodWithNoParam); g_Test_testMethodWithNoParam);
return ret; return ret;
} }
static base::android::ScopedJavaLocalRef<jstring> static base::android::ScopedJavaLocalRef<jstring>
testStaticMethodWithNoParam(JNIEnv* env) { testStaticMethodWithNoParam(JNIEnv* env) {
jstring ret = static_cast<jstring>(env->CallStaticObjectMethod(g_Test_clazz, jstring ret =
static_cast<jstring>(env->CallStaticObjectMethod(Test_clazz(env),
g_Test_testStaticMethodWithNoParam)); g_Test_testStaticMethodWithNoParam));
return base::android::ScopedJavaLocalRef<jstring>(env, ret); return base::android::ScopedJavaLocalRef<jstring>(env, ret);
} }
...@@ -81,16 +90,16 @@ static bool RegisterNativesImpl(JNIEnv* env, jclass clazz) { ...@@ -81,16 +90,16 @@ static bool RegisterNativesImpl(JNIEnv* env, jclass clazz) {
const int kMethodsTestSize = arraysize(kMethodsTest); const int kMethodsTestSize = arraysize(kMethodsTest);
if (env->RegisterNatives(g_Test_clazz, if (env->RegisterNatives(Test_clazz(env),
kMethodsTest, kMethodsTest,
kMethodsTestSize) < 0) { kMethodsTestSize) < 0) {
jni_generator::HandleRegistrationError( jni_generator::HandleRegistrationError(
env, g_Test_clazz, __FILE__); env, Test_clazz(env), __FILE__);
return false; return false;
} }
g_Test_testMethodWithParam = env->GetMethodID( g_Test_testMethodWithParam = env->GetMethodID(
g_Test_clazz, Test_clazz(env),
"testMethodWithParam", "testMethodWithParam",
"(" "("
"I" "I"
...@@ -101,7 +110,7 @@ static bool RegisterNativesImpl(JNIEnv* env, jclass clazz) { ...@@ -101,7 +110,7 @@ static bool RegisterNativesImpl(JNIEnv* env, jclass clazz) {
} }
g_Test_testStaticMethodWithParam = env->GetStaticMethodID( g_Test_testStaticMethodWithParam = env->GetStaticMethodID(
g_Test_clazz, Test_clazz(env),
"testStaticMethodWithParam", "testStaticMethodWithParam",
"(" "("
"I" "I"
...@@ -112,7 +121,7 @@ static bool RegisterNativesImpl(JNIEnv* env, jclass clazz) { ...@@ -112,7 +121,7 @@ static bool RegisterNativesImpl(JNIEnv* env, jclass clazz) {
} }
g_Test_testMethodWithNoParam = env->GetStaticMethodID( g_Test_testMethodWithNoParam = env->GetStaticMethodID(
g_Test_clazz, Test_clazz(env),
"testMethodWithNoParam", "testMethodWithNoParam",
"(" "("
")" ")"
...@@ -122,7 +131,7 @@ static bool RegisterNativesImpl(JNIEnv* env, jclass clazz) { ...@@ -122,7 +131,7 @@ static bool RegisterNativesImpl(JNIEnv* env, jclass clazz) {
} }
g_Test_testStaticMethodWithNoParam = env->GetStaticMethodID( g_Test_testStaticMethodWithNoParam = env->GetStaticMethodID(
g_Test_clazz, Test_clazz(env),
"testStaticMethodWithNoParam", "testStaticMethodWithNoParam",
"(" "("
")" ")"
......
// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
...@@ -19,8 +19,16 @@ ...@@ -19,8 +19,16 @@
// Step 1: forward declarations. // Step 1: forward declarations.
namespace { namespace {
const char kInputStreamClassPath[] = "java/io/InputStream"; const char kInputStreamClassPath[] = "java/io/InputStream";
#if __clang__
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-function"
#endif
// Leaking this jclass as we cannot use LazyInstance from some threads. // Leaking this jclass as we cannot use LazyInstance from some threads.
jclass g_InputStream_clazz = NULL; jclass g_InputStream_clazz = NULL;
jclass InputStream_clazz(JNIEnv*) { return g_InputStream_clazz; }
#if __clang__
#pragma clang diagnostic pop
#endif
} // namespace } // namespace
...@@ -34,11 +42,11 @@ static jint Java_InputStream_available(JNIEnv* env, jobject obj) __attribute__ ...@@ -34,11 +42,11 @@ static jint Java_InputStream_available(JNIEnv* env, jobject obj) __attribute__
static jint Java_InputStream_available(JNIEnv* env, jobject obj) { static jint Java_InputStream_available(JNIEnv* env, jobject obj) {
/* Must call RegisterNativesImpl() */ /* Must call RegisterNativesImpl() */
CHECK_CLAZZ(env, obj, CHECK_CLAZZ(env, obj,
g_InputStream_clazz, 0); InputStream_clazz(env), 0);
jmethodID method_id = jmethodID method_id =
base::android::MethodID::LazyGet< base::android::MethodID::LazyGet<
base::android::MethodID::TYPE_INSTANCE>( base::android::MethodID::TYPE_INSTANCE>(
env, g_InputStream_clazz, env, InputStream_clazz(env),
"available", "available",
"()I", "()I",
&g_InputStream_available); &g_InputStream_available);
...@@ -56,11 +64,11 @@ static void Java_InputStream_close(JNIEnv* env, jobject obj) __attribute__ ...@@ -56,11 +64,11 @@ static void Java_InputStream_close(JNIEnv* env, jobject obj) __attribute__
static void Java_InputStream_close(JNIEnv* env, jobject obj) { static void Java_InputStream_close(JNIEnv* env, jobject obj) {
/* Must call RegisterNativesImpl() */ /* Must call RegisterNativesImpl() */
CHECK_CLAZZ(env, obj, CHECK_CLAZZ(env, obj,
g_InputStream_clazz); InputStream_clazz(env));
jmethodID method_id = jmethodID method_id =
base::android::MethodID::LazyGet< base::android::MethodID::LazyGet<
base::android::MethodID::TYPE_INSTANCE>( base::android::MethodID::TYPE_INSTANCE>(
env, g_InputStream_clazz, env, InputStream_clazz(env),
"close", "close",
"()V", "()V",
&g_InputStream_close); &g_InputStream_close);
...@@ -77,11 +85,11 @@ static void Java_InputStream_mark(JNIEnv* env, jobject obj, JniIntWrapper p0) ...@@ -77,11 +85,11 @@ static void Java_InputStream_mark(JNIEnv* env, jobject obj, JniIntWrapper p0)
static void Java_InputStream_mark(JNIEnv* env, jobject obj, JniIntWrapper p0) { static void Java_InputStream_mark(JNIEnv* env, jobject obj, JniIntWrapper p0) {
/* Must call RegisterNativesImpl() */ /* Must call RegisterNativesImpl() */
CHECK_CLAZZ(env, obj, CHECK_CLAZZ(env, obj,
g_InputStream_clazz); InputStream_clazz(env));
jmethodID method_id = jmethodID method_id =
base::android::MethodID::LazyGet< base::android::MethodID::LazyGet<
base::android::MethodID::TYPE_INSTANCE>( base::android::MethodID::TYPE_INSTANCE>(
env, g_InputStream_clazz, env, InputStream_clazz(env),
"mark", "mark",
"(I)V", "(I)V",
&g_InputStream_mark); &g_InputStream_mark);
...@@ -98,11 +106,11 @@ static jboolean Java_InputStream_markSupported(JNIEnv* env, jobject obj) ...@@ -98,11 +106,11 @@ static jboolean Java_InputStream_markSupported(JNIEnv* env, jobject obj)
static jboolean Java_InputStream_markSupported(JNIEnv* env, jobject obj) { static jboolean Java_InputStream_markSupported(JNIEnv* env, jobject obj) {
/* Must call RegisterNativesImpl() */ /* Must call RegisterNativesImpl() */
CHECK_CLAZZ(env, obj, CHECK_CLAZZ(env, obj,
g_InputStream_clazz, false); InputStream_clazz(env), false);
jmethodID method_id = jmethodID method_id =
base::android::MethodID::LazyGet< base::android::MethodID::LazyGet<
base::android::MethodID::TYPE_INSTANCE>( base::android::MethodID::TYPE_INSTANCE>(
env, g_InputStream_clazz, env, InputStream_clazz(env),
"markSupported", "markSupported",
"()Z", "()Z",
&g_InputStream_markSupported); &g_InputStream_markSupported);
...@@ -120,11 +128,11 @@ static jint Java_InputStream_readI(JNIEnv* env, jobject obj) __attribute__ ...@@ -120,11 +128,11 @@ static jint Java_InputStream_readI(JNIEnv* env, jobject obj) __attribute__
static jint Java_InputStream_readI(JNIEnv* env, jobject obj) { static jint Java_InputStream_readI(JNIEnv* env, jobject obj) {
/* Must call RegisterNativesImpl() */ /* Must call RegisterNativesImpl() */
CHECK_CLAZZ(env, obj, CHECK_CLAZZ(env, obj,
g_InputStream_clazz, 0); InputStream_clazz(env), 0);
jmethodID method_id = jmethodID method_id =
base::android::MethodID::LazyGet< base::android::MethodID::LazyGet<
base::android::MethodID::TYPE_INSTANCE>( base::android::MethodID::TYPE_INSTANCE>(
env, g_InputStream_clazz, env, InputStream_clazz(env),
"read", "read",
"()I", "()I",
&g_InputStream_readI); &g_InputStream_readI);
...@@ -142,11 +150,11 @@ static jint Java_InputStream_readI_AB(JNIEnv* env, jobject obj, jbyteArray p0) ...@@ -142,11 +150,11 @@ static jint Java_InputStream_readI_AB(JNIEnv* env, jobject obj, jbyteArray p0)
static jint Java_InputStream_readI_AB(JNIEnv* env, jobject obj, jbyteArray p0) { static jint Java_InputStream_readI_AB(JNIEnv* env, jobject obj, jbyteArray p0) {
/* Must call RegisterNativesImpl() */ /* Must call RegisterNativesImpl() */
CHECK_CLAZZ(env, obj, CHECK_CLAZZ(env, obj,
g_InputStream_clazz, 0); InputStream_clazz(env), 0);
jmethodID method_id = jmethodID method_id =
base::android::MethodID::LazyGet< base::android::MethodID::LazyGet<
base::android::MethodID::TYPE_INSTANCE>( base::android::MethodID::TYPE_INSTANCE>(
env, g_InputStream_clazz, env, InputStream_clazz(env),
"read", "read",
"([B)I", "([B)I",
&g_InputStream_readI_AB); &g_InputStream_readI_AB);
...@@ -169,11 +177,11 @@ static jint Java_InputStream_readI_AB_I_I(JNIEnv* env, jobject obj, jbyteArray ...@@ -169,11 +177,11 @@ static jint Java_InputStream_readI_AB_I_I(JNIEnv* env, jobject obj, jbyteArray
JniIntWrapper p2) { JniIntWrapper p2) {
/* Must call RegisterNativesImpl() */ /* Must call RegisterNativesImpl() */
CHECK_CLAZZ(env, obj, CHECK_CLAZZ(env, obj,
g_InputStream_clazz, 0); InputStream_clazz(env), 0);
jmethodID method_id = jmethodID method_id =
base::android::MethodID::LazyGet< base::android::MethodID::LazyGet<
base::android::MethodID::TYPE_INSTANCE>( base::android::MethodID::TYPE_INSTANCE>(
env, g_InputStream_clazz, env, InputStream_clazz(env),
"read", "read",
"([BII)I", "([BII)I",
&g_InputStream_readI_AB_I_I); &g_InputStream_readI_AB_I_I);
...@@ -191,11 +199,11 @@ static void Java_InputStream_reset(JNIEnv* env, jobject obj) __attribute__ ...@@ -191,11 +199,11 @@ static void Java_InputStream_reset(JNIEnv* env, jobject obj) __attribute__
static void Java_InputStream_reset(JNIEnv* env, jobject obj) { static void Java_InputStream_reset(JNIEnv* env, jobject obj) {
/* Must call RegisterNativesImpl() */ /* Must call RegisterNativesImpl() */
CHECK_CLAZZ(env, obj, CHECK_CLAZZ(env, obj,
g_InputStream_clazz); InputStream_clazz(env));
jmethodID method_id = jmethodID method_id =
base::android::MethodID::LazyGet< base::android::MethodID::LazyGet<
base::android::MethodID::TYPE_INSTANCE>( base::android::MethodID::TYPE_INSTANCE>(
env, g_InputStream_clazz, env, InputStream_clazz(env),
"reset", "reset",
"()V", "()V",
&g_InputStream_reset); &g_InputStream_reset);
...@@ -212,11 +220,11 @@ static jlong Java_InputStream_skip(JNIEnv* env, jobject obj, jlong p0) ...@@ -212,11 +220,11 @@ static jlong Java_InputStream_skip(JNIEnv* env, jobject obj, jlong p0)
static jlong Java_InputStream_skip(JNIEnv* env, jobject obj, jlong p0) { static jlong Java_InputStream_skip(JNIEnv* env, jobject obj, jlong p0) {
/* Must call RegisterNativesImpl() */ /* Must call RegisterNativesImpl() */
CHECK_CLAZZ(env, obj, CHECK_CLAZZ(env, obj,
g_InputStream_clazz, 0); InputStream_clazz(env), 0);
jmethodID method_id = jmethodID method_id =
base::android::MethodID::LazyGet< base::android::MethodID::LazyGet<
base::android::MethodID::TYPE_INSTANCE>( base::android::MethodID::TYPE_INSTANCE>(
env, g_InputStream_clazz, env, InputStream_clazz(env),
"skip", "skip",
"(J)J", "(J)J",
&g_InputStream_skip); &g_InputStream_skip);
...@@ -234,18 +242,18 @@ static base::android::ScopedJavaLocalRef<jobject> ...@@ -234,18 +242,18 @@ static base::android::ScopedJavaLocalRef<jobject>
static base::android::ScopedJavaLocalRef<jobject> static base::android::ScopedJavaLocalRef<jobject>
Java_InputStream_Constructor(JNIEnv* env) { Java_InputStream_Constructor(JNIEnv* env) {
/* Must call RegisterNativesImpl() */ /* Must call RegisterNativesImpl() */
CHECK_CLAZZ(env, g_InputStream_clazz, CHECK_CLAZZ(env, InputStream_clazz(env),
g_InputStream_clazz, NULL); InputStream_clazz(env), NULL);
jmethodID method_id = jmethodID method_id =
base::android::MethodID::LazyGet< base::android::MethodID::LazyGet<
base::android::MethodID::TYPE_INSTANCE>( base::android::MethodID::TYPE_INSTANCE>(
env, g_InputStream_clazz, env, InputStream_clazz(env),
"<init>", "<init>",
"()V", "()V",
&g_InputStream_Constructor); &g_InputStream_Constructor);
jobject ret = jobject ret =
env->NewObject(g_InputStream_clazz, env->NewObject(InputStream_clazz(env),
method_id); method_id);
jni_generator::CheckException(env); jni_generator::CheckException(env);
return base::android::ScopedJavaLocalRef<jobject>(env, ret); return base::android::ScopedJavaLocalRef<jobject>(env, ret);
......
// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
...@@ -19,8 +19,16 @@ ...@@ -19,8 +19,16 @@
// Step 1: forward declarations. // Step 1: forward declarations.
namespace { namespace {
const char kHashSetClassPath[] = "java/util/HashSet"; const char kHashSetClassPath[] = "java/util/HashSet";
#if __clang__
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-function"
#endif
// Leaking this jclass as we cannot use LazyInstance from some threads. // Leaking this jclass as we cannot use LazyInstance from some threads.
jclass g_HashSet_clazz = NULL; jclass g_HashSet_clazz = NULL;
jclass HashSet_clazz(JNIEnv*) { return g_HashSet_clazz; }
#if __clang__
#pragma clang diagnostic pop
#endif
} // namespace } // namespace
...@@ -34,11 +42,11 @@ static void Java_HashSet_dummy(JNIEnv* env, jobject obj) __attribute__ ...@@ -34,11 +42,11 @@ static void Java_HashSet_dummy(JNIEnv* env, jobject obj) __attribute__
static void Java_HashSet_dummy(JNIEnv* env, jobject obj) { static void Java_HashSet_dummy(JNIEnv* env, jobject obj) {
/* Must call RegisterNativesImpl() */ /* Must call RegisterNativesImpl() */
CHECK_CLAZZ(env, obj, CHECK_CLAZZ(env, obj,
g_HashSet_clazz); HashSet_clazz(env));
jmethodID method_id = jmethodID method_id =
base::android::MethodID::LazyGet< base::android::MethodID::LazyGet<
base::android::MethodID::TYPE_INSTANCE>( base::android::MethodID::TYPE_INSTANCE>(
env, g_HashSet_clazz, env, HashSet_clazz(env),
"dummy", "dummy",
"()V", "()V",
&g_HashSet_dummy); &g_HashSet_dummy);
......
// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
...@@ -20,8 +20,16 @@ ...@@ -20,8 +20,16 @@
namespace { namespace {
const char kTestJniClassPath[] = "org/chromium/TestJni"; const char kTestJniClassPath[] = "org/chromium/TestJni";
const char kMyInnerClassClassPath[] = "org/chromium/TestJni$MyInnerClass"; const char kMyInnerClassClassPath[] = "org/chromium/TestJni$MyInnerClass";
#if __clang__
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-function"
#endif
// Leaking this jclass as we cannot use LazyInstance from some threads. // Leaking this jclass as we cannot use LazyInstance from some threads.
jclass g_TestJni_clazz = NULL; jclass g_TestJni_clazz = NULL;
jclass TestJni_clazz(JNIEnv*) { return g_TestJni_clazz; }
#if __clang__
#pragma clang diagnostic pop
#endif
} // namespace } // namespace
...@@ -44,11 +52,11 @@ static bool RegisterNativesImpl(JNIEnv* env) { ...@@ -44,11 +52,11 @@ static bool RegisterNativesImpl(JNIEnv* env) {
const int kMethodsMyInnerClassSize = arraysize(kMethodsMyInnerClass); const int kMethodsMyInnerClassSize = arraysize(kMethodsMyInnerClass);
if (env->RegisterNatives(g_MyInnerClass_clazz, if (env->RegisterNatives(MyInnerClass_clazz(env),
kMethodsMyInnerClass, kMethodsMyInnerClass,
kMethodsMyInnerClassSize) < 0) { kMethodsMyInnerClassSize) < 0) {
jni_generator::HandleRegistrationError( jni_generator::HandleRegistrationError(
env, g_MyInnerClass_clazz, __FILE__); env, MyInnerClass_clazz(env), __FILE__);
return false; return false;
} }
......
// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
...@@ -21,8 +21,16 @@ namespace { ...@@ -21,8 +21,16 @@ namespace {
const char kMyOtherInnerClassClassPath[] = const char kMyOtherInnerClassClassPath[] =
"org/chromium/TestJni$MyOtherInnerClass"; "org/chromium/TestJni$MyOtherInnerClass";
const char kTestJniClassPath[] = "org/chromium/TestJni"; const char kTestJniClassPath[] = "org/chromium/TestJni";
#if __clang__
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-function"
#endif
// Leaking this jclass as we cannot use LazyInstance from some threads. // Leaking this jclass as we cannot use LazyInstance from some threads.
jclass g_TestJni_clazz = NULL; jclass g_TestJni_clazz = NULL;
jclass TestJni_clazz(JNIEnv*) { return g_TestJni_clazz; }
#if __clang__
#pragma clang diagnostic pop
#endif
} // namespace } // namespace
...@@ -55,21 +63,21 @@ static bool RegisterNativesImpl(JNIEnv* env) { ...@@ -55,21 +63,21 @@ static bool RegisterNativesImpl(JNIEnv* env) {
const int kMethodsMyOtherInnerClassSize = const int kMethodsMyOtherInnerClassSize =
arraysize(kMethodsMyOtherInnerClass); arraysize(kMethodsMyOtherInnerClass);
if (env->RegisterNatives(g_MyOtherInnerClass_clazz, if (env->RegisterNatives(MyOtherInnerClass_clazz(env),
kMethodsMyOtherInnerClass, kMethodsMyOtherInnerClass,
kMethodsMyOtherInnerClassSize) < 0) { kMethodsMyOtherInnerClassSize) < 0) {
jni_generator::HandleRegistrationError( jni_generator::HandleRegistrationError(
env, g_MyOtherInnerClass_clazz, __FILE__); env, MyOtherInnerClass_clazz(env), __FILE__);
return false; return false;
} }
const int kMethodsTestJniSize = arraysize(kMethodsTestJni); const int kMethodsTestJniSize = arraysize(kMethodsTestJni);
if (env->RegisterNatives(g_TestJni_clazz, if (env->RegisterNatives(TestJni_clazz(env),
kMethodsTestJni, kMethodsTestJni,
kMethodsTestJniSize) < 0) { kMethodsTestJniSize) < 0) {
jni_generator::HandleRegistrationError( jni_generator::HandleRegistrationError(
env, g_TestJni_clazz, __FILE__); env, TestJni_clazz(env), __FILE__);
return false; return false;
} }
......
// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
...@@ -22,8 +22,16 @@ const char kMyOtherInnerClassClassPath[] = ...@@ -22,8 +22,16 @@ const char kMyOtherInnerClassClassPath[] =
"org/chromium/TestJni$MyOtherInnerClass"; "org/chromium/TestJni$MyOtherInnerClass";
const char kTestJniClassPath[] = "org/chromium/TestJni"; const char kTestJniClassPath[] = "org/chromium/TestJni";
const char kMyInnerClassClassPath[] = "org/chromium/TestJni$MyInnerClass"; const char kMyInnerClassClassPath[] = "org/chromium/TestJni$MyInnerClass";
#if __clang__
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-function"
#endif
// Leaking this jclass as we cannot use LazyInstance from some threads. // Leaking this jclass as we cannot use LazyInstance from some threads.
jclass g_TestJni_clazz = NULL; jclass g_TestJni_clazz = NULL;
jclass TestJni_clazz(JNIEnv*) { return g_TestJni_clazz; }
#if __clang__
#pragma clang diagnostic pop
#endif
} // namespace } // namespace
...@@ -56,21 +64,21 @@ static bool RegisterNativesImpl(JNIEnv* env) { ...@@ -56,21 +64,21 @@ static bool RegisterNativesImpl(JNIEnv* env) {
const int kMethodsMyOtherInnerClassSize = const int kMethodsMyOtherInnerClassSize =
arraysize(kMethodsMyOtherInnerClass); arraysize(kMethodsMyOtherInnerClass);
if (env->RegisterNatives(g_MyOtherInnerClass_clazz, if (env->RegisterNatives(MyOtherInnerClass_clazz(env),
kMethodsMyOtherInnerClass, kMethodsMyOtherInnerClass,
kMethodsMyOtherInnerClassSize) < 0) { kMethodsMyOtherInnerClassSize) < 0) {
jni_generator::HandleRegistrationError( jni_generator::HandleRegistrationError(
env, g_MyOtherInnerClass_clazz, __FILE__); env, MyOtherInnerClass_clazz(env), __FILE__);
return false; return false;
} }
const int kMethodsMyInnerClassSize = arraysize(kMethodsMyInnerClass); const int kMethodsMyInnerClassSize = arraysize(kMethodsMyInnerClass);
if (env->RegisterNatives(g_MyInnerClass_clazz, if (env->RegisterNatives(MyInnerClass_clazz(env),
kMethodsMyInnerClass, kMethodsMyInnerClass,
kMethodsMyInnerClassSize) < 0) { kMethodsMyInnerClassSize) < 0) {
jni_generator::HandleRegistrationError( jni_generator::HandleRegistrationError(
env, g_MyInnerClass_clazz, __FILE__); env, MyInnerClass_clazz(env), __FILE__);
return false; return false;
} }
......
// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
...@@ -19,8 +19,16 @@ ...@@ -19,8 +19,16 @@
// Step 1: forward declarations. // Step 1: forward declarations.
namespace { namespace {
const char kTestClassPath[] = "org/chromium/example/jni_generator/Test"; const char kTestClassPath[] = "org/chromium/example/jni_generator/Test";
#if __clang__
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-function"
#endif
// Leaking this jclass as we cannot use LazyInstance from some threads. // Leaking this jclass as we cannot use LazyInstance from some threads.
jclass g_Test_clazz = NULL; jclass g_Test_clazz = NULL;
jclass Test_clazz(JNIEnv*) { return g_Test_clazz; }
#if __clang__
#pragma clang diagnostic pop
#endif
} // namespace } // namespace
...@@ -49,11 +57,11 @@ static bool RegisterNativesImpl(JNIEnv* env, jclass clazz) { ...@@ -49,11 +57,11 @@ static bool RegisterNativesImpl(JNIEnv* env, jclass clazz) {
const int kMethodsTestSize = arraysize(kMethodsTest); const int kMethodsTestSize = arraysize(kMethodsTest);
if (env->RegisterNatives(g_Test_clazz, if (env->RegisterNatives(Test_clazz(env),
kMethodsTest, kMethodsTest,
kMethodsTestSize) < 0) { kMethodsTestSize) < 0) {
jni_generator::HandleRegistrationError( jni_generator::HandleRegistrationError(
env, g_Test_clazz, __FILE__); env, Test_clazz(env), __FILE__);
return false; return false;
} }
......
// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
...@@ -19,8 +19,16 @@ ...@@ -19,8 +19,16 @@
// Step 1: forward declarations. // Step 1: forward declarations.
namespace { namespace {
const char kExampleClassPath[] = "com/test/jni_generator/Example"; const char kExampleClassPath[] = "com/test/jni_generator/Example";
#if __clang__
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-function"
#endif
// Leaking this jclass as we cannot use LazyInstance from some threads. // Leaking this jclass as we cannot use LazyInstance from some threads.
jclass g_Example_clazz = NULL; jclass g_Example_clazz = NULL;
jclass Example_clazz(JNIEnv*) { return g_Example_clazz; }
#if __clang__
#pragma clang diagnostic pop
#endif
} // namespace } // namespace
...@@ -69,11 +77,11 @@ static bool RegisterNativesImpl(JNIEnv* env) { ...@@ -69,11 +77,11 @@ static bool RegisterNativesImpl(JNIEnv* env) {
const int kMethodsExampleSize = arraysize(kMethodsExample); const int kMethodsExampleSize = arraysize(kMethodsExample);
if (env->RegisterNatives(g_Example_clazz, if (env->RegisterNatives(Example_clazz(env),
kMethodsExample, kMethodsExample,
kMethodsExampleSize) < 0) { kMethodsExampleSize) < 0) {
jni_generator::HandleRegistrationError( jni_generator::HandleRegistrationError(
env, g_Example_clazz, __FILE__); env, Example_clazz(env), __FILE__);
return false; return false;
} }
......
// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
...@@ -19,8 +19,16 @@ ...@@ -19,8 +19,16 @@
// Step 1: forward declarations. // Step 1: forward declarations.
namespace { namespace {
const char kFooClassPath[] = "org/chromium/foo/Foo"; const char kFooClassPath[] = "org/chromium/foo/Foo";
#if __clang__
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-function"
#endif
// Leaking this jclass as we cannot use LazyInstance from some threads. // Leaking this jclass as we cannot use LazyInstance from some threads.
jclass g_Foo_clazz = NULL; jclass g_Foo_clazz = NULL;
jclass Foo_clazz(JNIEnv*) { return g_Foo_clazz; }
#if __clang__
#pragma clang diagnostic pop
#endif
} // namespace } // namespace
...@@ -34,12 +42,12 @@ static base::subtle::AtomicWord g_Foo_calledByNative = 0; ...@@ -34,12 +42,12 @@ static base::subtle::AtomicWord g_Foo_calledByNative = 0;
static void Java_Foo_calledByNative(JNIEnv* env, jobject callback1, static void Java_Foo_calledByNative(JNIEnv* env, jobject callback1,
jobject callback2) { jobject callback2) {
/* Must call RegisterNativesImpl() */ /* Must call RegisterNativesImpl() */
CHECK_CLAZZ(env, g_Foo_clazz, CHECK_CLAZZ(env, Foo_clazz(env),
g_Foo_clazz); Foo_clazz(env));
jmethodID method_id = jmethodID method_id =
base::android::MethodID::LazyGet< base::android::MethodID::LazyGet<
base::android::MethodID::TYPE_STATIC>( base::android::MethodID::TYPE_STATIC>(
env, g_Foo_clazz, env, Foo_clazz(env),
"calledByNative", "calledByNative",
"(" "("
...@@ -49,7 +57,7 @@ static void Java_Foo_calledByNative(JNIEnv* env, jobject callback1, ...@@ -49,7 +57,7 @@ static void Java_Foo_calledByNative(JNIEnv* env, jobject callback1,
"V", "V",
&g_Foo_calledByNative); &g_Foo_calledByNative);
env->CallStaticVoidMethod(g_Foo_clazz, env->CallStaticVoidMethod(Foo_clazz(env),
method_id, callback1, callback2); method_id, callback1, callback2);
jni_generator::CheckException(env); jni_generator::CheckException(env);
...@@ -72,11 +80,11 @@ static bool RegisterNativesImpl(JNIEnv* env) { ...@@ -72,11 +80,11 @@ static bool RegisterNativesImpl(JNIEnv* env) {
const int kMethodsFooSize = arraysize(kMethodsFoo); const int kMethodsFooSize = arraysize(kMethodsFoo);
if (env->RegisterNatives(g_Foo_clazz, if (env->RegisterNatives(Foo_clazz(env),
kMethodsFoo, kMethodsFoo,
kMethodsFooSize) < 0) { kMethodsFooSize) < 0) {
jni_generator::HandleRegistrationError( jni_generator::HandleRegistrationError(
env, g_Foo_clazz, __FILE__); env, Foo_clazz(env), __FILE__);
return false; return false;
} }
......
...@@ -20,8 +20,19 @@ ...@@ -20,8 +20,19 @@
namespace { namespace {
const char kSampleForTestsClassPath[] = const char kSampleForTestsClassPath[] =
"org/chromium/example/jni_generator/SampleForTests"; "org/chromium/example/jni_generator/SampleForTests";
#if __clang__
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-function"
#endif
// Leaking this jclass as we cannot use LazyInstance from some threads. // Leaking this jclass as we cannot use LazyInstance from some threads.
jclass g_SampleForTests_clazz = NULL; base::subtle::AtomicWord g_SampleForTests_clazz = 0;
jclass SampleForTests_clazz(JNIEnv* env) {
return base::android::LazyGetClass(env, kSampleForTestsClassPath,
&g_SampleForTests_clazz);
}
#if __clang__
#pragma clang diagnostic pop
#endif
} // namespace } // namespace
...@@ -79,11 +90,11 @@ static void Java_SampleForTests_testMethodWithParam(JNIEnv* env, jobject obj, ...@@ -79,11 +90,11 @@ static void Java_SampleForTests_testMethodWithParam(JNIEnv* env, jobject obj,
JniIntWrapper iParam) { JniIntWrapper iParam) {
/* Must call RegisterNativesImpl() */ /* Must call RegisterNativesImpl() */
CHECK_CLAZZ(env, obj, CHECK_CLAZZ(env, obj,
g_SampleForTests_clazz); SampleForTests_clazz(env));
jmethodID method_id = jmethodID method_id =
base::android::MethodID::LazyGet< base::android::MethodID::LazyGet<
base::android::MethodID::TYPE_INSTANCE>( base::android::MethodID::TYPE_INSTANCE>(
env, g_SampleForTests_clazz, env, SampleForTests_clazz(env),
"testMethodWithParam", "testMethodWithParam",
"(" "("
...@@ -105,11 +116,11 @@ static base::android::ScopedJavaLocalRef<jstring> ...@@ -105,11 +116,11 @@ static base::android::ScopedJavaLocalRef<jstring>
JniIntWrapper iParam) { JniIntWrapper iParam) {
/* Must call RegisterNativesImpl() */ /* Must call RegisterNativesImpl() */
CHECK_CLAZZ(env, obj, CHECK_CLAZZ(env, obj,
g_SampleForTests_clazz, NULL); SampleForTests_clazz(env), NULL);
jmethodID method_id = jmethodID method_id =
base::android::MethodID::LazyGet< base::android::MethodID::LazyGet<
base::android::MethodID::TYPE_INSTANCE>( base::android::MethodID::TYPE_INSTANCE>(
env, g_SampleForTests_clazz, env, SampleForTests_clazz(env),
"testMethodWithParamAndReturn", "testMethodWithParamAndReturn",
"(" "("
...@@ -129,12 +140,12 @@ static base::subtle::AtomicWord g_SampleForTests_testStaticMethodWithParam = 0; ...@@ -129,12 +140,12 @@ static base::subtle::AtomicWord g_SampleForTests_testStaticMethodWithParam = 0;
static jint Java_SampleForTests_testStaticMethodWithParam(JNIEnv* env, static jint Java_SampleForTests_testStaticMethodWithParam(JNIEnv* env,
JniIntWrapper iParam) { JniIntWrapper iParam) {
/* Must call RegisterNativesImpl() */ /* Must call RegisterNativesImpl() */
CHECK_CLAZZ(env, g_SampleForTests_clazz, CHECK_CLAZZ(env, SampleForTests_clazz(env),
g_SampleForTests_clazz, 0); SampleForTests_clazz(env), 0);
jmethodID method_id = jmethodID method_id =
base::android::MethodID::LazyGet< base::android::MethodID::LazyGet<
base::android::MethodID::TYPE_STATIC>( base::android::MethodID::TYPE_STATIC>(
env, g_SampleForTests_clazz, env, SampleForTests_clazz(env),
"testStaticMethodWithParam", "testStaticMethodWithParam",
"(" "("
...@@ -144,7 +155,7 @@ static jint Java_SampleForTests_testStaticMethodWithParam(JNIEnv* env, ...@@ -144,7 +155,7 @@ static jint Java_SampleForTests_testStaticMethodWithParam(JNIEnv* env,
&g_SampleForTests_testStaticMethodWithParam); &g_SampleForTests_testStaticMethodWithParam);
jint ret = jint ret =
env->CallStaticIntMethod(g_SampleForTests_clazz, env->CallStaticIntMethod(SampleForTests_clazz(env),
method_id, as_jint(iParam)); method_id, as_jint(iParam));
jni_generator::CheckException(env); jni_generator::CheckException(env);
return ret; return ret;
...@@ -153,12 +164,12 @@ static jint Java_SampleForTests_testStaticMethodWithParam(JNIEnv* env, ...@@ -153,12 +164,12 @@ static jint Java_SampleForTests_testStaticMethodWithParam(JNIEnv* env,
static base::subtle::AtomicWord g_SampleForTests_testMethodWithNoParam = 0; static base::subtle::AtomicWord g_SampleForTests_testMethodWithNoParam = 0;
static jdouble Java_SampleForTests_testMethodWithNoParam(JNIEnv* env) { static jdouble Java_SampleForTests_testMethodWithNoParam(JNIEnv* env) {
/* Must call RegisterNativesImpl() */ /* Must call RegisterNativesImpl() */
CHECK_CLAZZ(env, g_SampleForTests_clazz, CHECK_CLAZZ(env, SampleForTests_clazz(env),
g_SampleForTests_clazz, 0); SampleForTests_clazz(env), 0);
jmethodID method_id = jmethodID method_id =
base::android::MethodID::LazyGet< base::android::MethodID::LazyGet<
base::android::MethodID::TYPE_STATIC>( base::android::MethodID::TYPE_STATIC>(
env, g_SampleForTests_clazz, env, SampleForTests_clazz(env),
"testMethodWithNoParam", "testMethodWithNoParam",
"(" "("
...@@ -167,7 +178,7 @@ static jdouble Java_SampleForTests_testMethodWithNoParam(JNIEnv* env) { ...@@ -167,7 +178,7 @@ static jdouble Java_SampleForTests_testMethodWithNoParam(JNIEnv* env) {
&g_SampleForTests_testMethodWithNoParam); &g_SampleForTests_testMethodWithNoParam);
jdouble ret = jdouble ret =
env->CallStaticDoubleMethod(g_SampleForTests_clazz, env->CallStaticDoubleMethod(SampleForTests_clazz(env),
method_id); method_id);
jni_generator::CheckException(env); jni_generator::CheckException(env);
return ret; return ret;
...@@ -178,12 +189,12 @@ static base::subtle::AtomicWord g_SampleForTests_testStaticMethodWithNoParam = ...@@ -178,12 +189,12 @@ static base::subtle::AtomicWord g_SampleForTests_testStaticMethodWithNoParam =
static base::android::ScopedJavaLocalRef<jstring> static base::android::ScopedJavaLocalRef<jstring>
Java_SampleForTests_testStaticMethodWithNoParam(JNIEnv* env) { Java_SampleForTests_testStaticMethodWithNoParam(JNIEnv* env) {
/* Must call RegisterNativesImpl() */ /* Must call RegisterNativesImpl() */
CHECK_CLAZZ(env, g_SampleForTests_clazz, CHECK_CLAZZ(env, SampleForTests_clazz(env),
g_SampleForTests_clazz, NULL); SampleForTests_clazz(env), NULL);
jmethodID method_id = jmethodID method_id =
base::android::MethodID::LazyGet< base::android::MethodID::LazyGet<
base::android::MethodID::TYPE_STATIC>( base::android::MethodID::TYPE_STATIC>(
env, g_SampleForTests_clazz, env, SampleForTests_clazz(env),
"testStaticMethodWithNoParam", "testStaticMethodWithNoParam",
"(" "("
...@@ -192,7 +203,7 @@ static base::android::ScopedJavaLocalRef<jstring> ...@@ -192,7 +203,7 @@ static base::android::ScopedJavaLocalRef<jstring>
&g_SampleForTests_testStaticMethodWithNoParam); &g_SampleForTests_testStaticMethodWithNoParam);
jstring ret = jstring ret =
static_cast<jstring>(env->CallStaticObjectMethod(g_SampleForTests_clazz, static_cast<jstring>(env->CallStaticObjectMethod(SampleForTests_clazz(env),
method_id)); method_id));
jni_generator::CheckException(env); jni_generator::CheckException(env);
return base::android::ScopedJavaLocalRef<jstring>(env, ret); return base::android::ScopedJavaLocalRef<jstring>(env, ret);
...@@ -202,7 +213,8 @@ static base::android::ScopedJavaLocalRef<jstring> ...@@ -202,7 +213,8 @@ static base::android::ScopedJavaLocalRef<jstring>
// Step 3: RegisterNatives. // Step 3: RegisterNatives.
static bool RegisterNativesImpl(JNIEnv* env, jclass clazz) { static bool RegisterNativesImpl(JNIEnv* env, jclass clazz) {
g_SampleForTests_clazz = static_cast<jclass>(env->NewWeakGlobalRef(clazz)); base::subtle::Release_Store(&g_SampleForTests_clazz,
static_cast<base::subtle::AtomicWord>(env->NewWeakGlobalRef(clazz));
return true; return true;
} }
......
// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
...@@ -19,8 +19,16 @@ ...@@ -19,8 +19,16 @@
// Step 1: forward declarations. // Step 1: forward declarations.
namespace { namespace {
const char kTestJniClassPath[] = "org/chromium/TestJni"; const char kTestJniClassPath[] = "org/chromium/TestJni";
#if __clang__
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-function"
#endif
// Leaking this jclass as we cannot use LazyInstance from some threads. // Leaking this jclass as we cannot use LazyInstance from some threads.
jclass g_TestJni_clazz = NULL; jclass g_TestJni_clazz = NULL;
jclass TestJni_clazz(JNIEnv*) { return g_TestJni_clazz; }
#if __clang__
#pragma clang diagnostic pop
#endif
} // namespace } // namespace
...@@ -202,11 +210,11 @@ static bool RegisterNativesImpl(JNIEnv* env) { ...@@ -202,11 +210,11 @@ static bool RegisterNativesImpl(JNIEnv* env) {
const int kMethodsTestJniSize = arraysize(kMethodsTestJni); const int kMethodsTestJniSize = arraysize(kMethodsTestJni);
if (env->RegisterNatives(g_TestJni_clazz, if (env->RegisterNatives(TestJni_clazz(env),
kMethodsTestJni, kMethodsTestJni,
kMethodsTestJniSize) < 0) { kMethodsTestJniSize) < 0) {
jni_generator::HandleRegistrationError( jni_generator::HandleRegistrationError(
env, g_TestJni_clazz, __FILE__); env, TestJni_clazz(env), __FILE__);
return false; return false;
} }
......
// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
...@@ -19,8 +19,16 @@ ...@@ -19,8 +19,16 @@
// Step 1: forward declarations. // Step 1: forward declarations.
namespace { namespace {
const char kTestJniClassPath[] = "org/chromium/TestJni"; const char kTestJniClassPath[] = "org/chromium/TestJni";
#if __clang__
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-function"
#endif
// Leaking this jclass as we cannot use LazyInstance from some threads. // Leaking this jclass as we cannot use LazyInstance from some threads.
jclass g_TestJni_clazz = NULL; jclass g_TestJni_clazz = NULL;
jclass TestJni_clazz(JNIEnv*) { return g_TestJni_clazz; }
#if __clang__
#pragma clang diagnostic pop
#endif
} // namespace } // namespace
...@@ -49,11 +57,11 @@ static bool RegisterNativesImpl(JNIEnv* env) { ...@@ -49,11 +57,11 @@ static bool RegisterNativesImpl(JNIEnv* env) {
const int kMethodsTestJniSize = arraysize(kMethodsTestJni); const int kMethodsTestJniSize = arraysize(kMethodsTestJni);
if (env->RegisterNatives(g_TestJni_clazz, if (env->RegisterNatives(TestJni_clazz(env),
kMethodsTestJni, kMethodsTestJni,
kMethodsTestJniSize) < 0) { kMethodsTestJniSize) < 0) {
jni_generator::HandleRegistrationError( jni_generator::HandleRegistrationError(
env, g_TestJni_clazz, __FILE__); env, TestJni_clazz(env), __FILE__);
return false; return false;
} }
......
// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
...@@ -19,8 +19,16 @@ ...@@ -19,8 +19,16 @@
// Step 1: forward declarations. // Step 1: forward declarations.
namespace { namespace {
const char kTestClassPath[] = "org/chromium/example/jni_generator/Test"; const char kTestClassPath[] = "org/chromium/example/jni_generator/Test";
#if __clang__
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-function"
#endif
// Leaking this jclass as we cannot use LazyInstance from some threads. // Leaking this jclass as we cannot use LazyInstance from some threads.
jclass g_Test_clazz = NULL; jclass g_Test_clazz = NULL;
jclass Test_clazz(JNIEnv*) { return g_Test_clazz; }
#if __clang__
#pragma clang diagnostic pop
#endif
} // namespace } // namespace
...@@ -50,11 +58,11 @@ static bool RegisterNativesImpl(JNIEnv* env) { ...@@ -50,11 +58,11 @@ static bool RegisterNativesImpl(JNIEnv* env) {
const int kMethodsTestSize = arraysize(kMethodsTest); const int kMethodsTestSize = arraysize(kMethodsTest);
if (env->RegisterNatives(g_Test_clazz, if (env->RegisterNatives(Test_clazz(env),
kMethodsTest, kMethodsTest,
kMethodsTestSize) < 0) { kMethodsTestSize) < 0) {
jni_generator::HandleRegistrationError( jni_generator::HandleRegistrationError(
env, g_Test_clazz, __FILE__); env, Test_clazz(env), __FILE__);
return false; return false;
} }
......
// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
...@@ -19,8 +19,16 @@ ...@@ -19,8 +19,16 @@
// Step 1: forward declarations. // Step 1: forward declarations.
namespace { namespace {
const char kFooClassPath[] = "org/chromium/foo/Foo"; const char kFooClassPath[] = "org/chromium/foo/Foo";
#if __clang__
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-function"
#endif
// Leaking this jclass as we cannot use LazyInstance from some threads. // Leaking this jclass as we cannot use LazyInstance from some threads.
jclass g_Foo_clazz = NULL; jclass g_Foo_clazz = NULL;
jclass Foo_clazz(JNIEnv*) { return g_Foo_clazz; }
#if __clang__
#pragma clang diagnostic pop
#endif
} // namespace } // namespace
...@@ -32,12 +40,12 @@ static void DoSomething(JNIEnv* env, jclass jcaller, ...@@ -32,12 +40,12 @@ static void DoSomething(JNIEnv* env, jclass jcaller,
static base::subtle::AtomicWord g_Foo_calledByNative = 0; static base::subtle::AtomicWord g_Foo_calledByNative = 0;
static void Java_Foo_calledByNative(JNIEnv* env, jobject callback) { static void Java_Foo_calledByNative(JNIEnv* env, jobject callback) {
/* Must call RegisterNativesImpl() */ /* Must call RegisterNativesImpl() */
CHECK_CLAZZ(env, g_Foo_clazz, CHECK_CLAZZ(env, Foo_clazz(env),
g_Foo_clazz); Foo_clazz(env));
jmethodID method_id = jmethodID method_id =
base::android::MethodID::LazyGet< base::android::MethodID::LazyGet<
base::android::MethodID::TYPE_STATIC>( base::android::MethodID::TYPE_STATIC>(
env, g_Foo_clazz, env, Foo_clazz(env),
"calledByNative", "calledByNative",
"(" "("
...@@ -46,7 +54,7 @@ static void Java_Foo_calledByNative(JNIEnv* env, jobject callback) { ...@@ -46,7 +54,7 @@ static void Java_Foo_calledByNative(JNIEnv* env, jobject callback) {
"V", "V",
&g_Foo_calledByNative); &g_Foo_calledByNative);
env->CallStaticVoidMethod(g_Foo_clazz, env->CallStaticVoidMethod(Foo_clazz(env),
method_id, callback); method_id, callback);
jni_generator::CheckException(env); jni_generator::CheckException(env);
...@@ -68,11 +76,11 @@ static bool RegisterNativesImpl(JNIEnv* env) { ...@@ -68,11 +76,11 @@ static bool RegisterNativesImpl(JNIEnv* env) {
const int kMethodsFooSize = arraysize(kMethodsFoo); const int kMethodsFooSize = arraysize(kMethodsFoo);
if (env->RegisterNatives(g_Foo_clazz, if (env->RegisterNatives(Foo_clazz(env),
kMethodsFoo, kMethodsFoo,
kMethodsFooSize) < 0) { kMethodsFooSize) < 0) {
jni_generator::HandleRegistrationError( jni_generator::HandleRegistrationError(
env, g_Foo_clazz, __FILE__); env, Foo_clazz(env), __FILE__);
return false; return false;
} }
......
// Copyright 2014 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.
#include "base/android/jni_utils.h"
#include "base/android/jni_android.h"
#include "base/android/scoped_java_ref.h"
#include "jni/JNIUtils_jni.h"
namespace base {
namespace android {
ScopedJavaLocalRef<jobject> GetClassLoader(JNIEnv* env) {
return Java_JNIUtils_getClassLoader(env);
}
bool RegisterJNIUtils(JNIEnv* env) {
return RegisterNativesImpl(env);
}
} // namespace android
} // namespace base
// Copyright 2014 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_UTILS_H_
#define BASE_ANDROID_JNI_UTILS_H_
#include <jni.h>
#include "base/android/scoped_java_ref.h"
namespace base {
namespace android {
// Gets a ClassLoader instance capable of loading Chromium java classes.
// This should be called either from JNI_OnLoad or from within a method called
// via JNI from Java.
BASE_EXPORT ScopedJavaLocalRef<jobject> GetClassLoader(JNIEnv* env);
bool RegisterJNIUtils(JNIEnv* env);
} // namespace android
} // namespace base
#endif // BASE_ANDROID_JNI_UTILS_H_
...@@ -1282,6 +1282,7 @@ ...@@ -1282,6 +1282,7 @@
'android/java/src/org/chromium/base/EventLog.java', 'android/java/src/org/chromium/base/EventLog.java',
'android/java/src/org/chromium/base/FieldTrialList.java', 'android/java/src/org/chromium/base/FieldTrialList.java',
'android/java/src/org/chromium/base/ImportantFileWriterAndroid.java', 'android/java/src/org/chromium/base/ImportantFileWriterAndroid.java',
'android/java/src/org/chromium/base/JNIUtils.java',
'android/java/src/org/chromium/base/library_loader/LibraryLoader.java', 'android/java/src/org/chromium/base/library_loader/LibraryLoader.java',
'android/java/src/org/chromium/base/MemoryPressureListener.java', 'android/java/src/org/chromium/base/MemoryPressureListener.java',
'android/java/src/org/chromium/base/JavaHandlerThread.java', 'android/java/src/org/chromium/base/JavaHandlerThread.java',
......
...@@ -55,6 +55,8 @@ ...@@ -55,6 +55,8 @@
'android/jni_registrar.h', 'android/jni_registrar.h',
'android/jni_string.cc', 'android/jni_string.cc',
'android/jni_string.h', 'android/jni_string.h',
'android/jni_utils.cc',
'android/jni_utils.h',
'android/jni_weak_ref.cc', 'android/jni_weak_ref.cc',
'android/jni_weak_ref.h', 'android/jni_weak_ref.h',
'android/library_loader/library_loader_hooks.cc', 'android/library_loader/library_loader_hooks.cc',
......
...@@ -32,7 +32,7 @@ ScopedJavaSurface::ScopedJavaSurface( ...@@ -32,7 +32,7 @@ ScopedJavaSurface::ScopedJavaSurface(
is_protected_(false) { is_protected_(false) {
JNIEnv* env = base::android::AttachCurrentThread(); JNIEnv* env = base::android::AttachCurrentThread();
RegisterNativesIfNeeded(env); RegisterNativesIfNeeded(env);
DCHECK(env->IsInstanceOf(surface.obj(), g_Surface_clazz)); DCHECK(env->IsInstanceOf(surface.obj(), Surface_clazz(env)));
j_surface_.Reset(surface); j_surface_.Reset(surface);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment