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 @@
#include "android_webview/native/android_webview_jni_registrar.h"
#include "base/android/jni_android.h"
#include "base/android/jni_registrar.h"
#include "base/android/jni_utils.h"
#include "base/android/library_loader/library_loader_hooks.h"
#include "components/navigation_interception/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) {
if (!android_webview::RegisterJni(env))
return -1;
base::android::InitReplacementClassLoader(env,
base::android::GetClassLoader(env));
content::SetContentMainDelegate(new android_webview::AwMainDelegate());
// Initialize url lib here while we are still single-threaded, in case we use
......
......@@ -49,6 +49,8 @@ component("base") {
"android/jni_registrar.h",
"android/jni_string.cc",
"android/jni_string.h",
"android/jni_utils.cc",
"android/jni_utils.h",
"android/jni_weak_ref.cc",
"android/jni_weak_ref.h",
"android/library_loader/library_loader_hooks.cc",
......@@ -1343,6 +1345,7 @@ if (is_android) {
"android/java/src/org/chromium/base/EventLog.java",
"android/java/src/org/chromium/base/FieldTrialList.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/MemoryPressureListener.java",
"android/java/src/org/chromium/base/JavaHandlerThread.java",
......
......@@ -15,6 +15,7 @@
#include "base/android/java_handler_thread.h"
#include "base/android/jni_android.h"
#include "base/android/jni_registrar.h"
#include "base/android/jni_utils.h"
#include "base/android/memory_pressure_listener_android.h"
#include "base/android/path_service_android.h"
#include "base/android/path_utils.h"
......@@ -40,6 +41,7 @@ static RegistrationMethod kBaseRegisteredMethods[] = {
{ "FieldTrialList", base::android::RegisterFieldTrialList },
{ "ImportantFileWriterAndroid",
base::android::RegisterImportantFileWriterAndroid },
{ "JNIUtils", base::android::RegisterJNIUtils },
{ "MemoryPressureListenerAndroid",
base::android::MemoryPressureListenerAndroid::Register },
{ "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 @@
#include "base/android/build_info.h"
#include "base/android/jni_string.h"
#include "base/android/jni_utils.h"
#include "base/lazy_instance.h"
#include "base/logging.h"
......@@ -21,6 +22,9 @@ JavaVM* g_jvm = NULL;
// that may still be running at shutdown. There is no harm in doing this.
base::LazyInstance<base::android::ScopedJavaGlobalRef<jobject> >::Leaky
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) {
ScopedJavaLocalRef<jclass> throwable_clazz =
......@@ -118,17 +122,68 @@ void InitApplicationContext(JNIEnv* env, const JavaRef<jobject>& 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() {
DCHECK(!g_application_context.Get().is_null());
return g_application_context.Get().obj();
}
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;
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>
jmethodID MethodID::Get(JNIEnv* env,
jclass clazz,
......
......@@ -53,6 +53,15 @@ BASE_EXPORT bool IsVMInitialized();
BASE_EXPORT void InitApplicationContext(JNIEnv* env,
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
// InitApplicationContext(). Ownership is retained by the function - the caller
// must NOT release it.
......@@ -66,6 +75,17 @@ const BASE_EXPORT jobject GetApplicationContext();
BASE_EXPORT ScopedJavaLocalRef<jclass> GetClass(JNIEnv* env,
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.
class BASE_EXPORT MethodID {
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
// found in the LICENSE file.
......@@ -24,12 +24,22 @@ const char kSampleForTestsClassPath[] =
"org/chromium/example/jni_generator/SampleForTests";
const char kInnerStructBClassPath[] =
"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.
jclass g_InnerStructA_clazz = NULL;
jclass InnerStructA_clazz(JNIEnv*) { return g_InnerStructA_clazz; }
// Leaking this jclass as we cannot use LazyInstance from some threads.
jclass g_SampleForTests_clazz = NULL;
jclass SampleForTests_clazz(JNIEnv*) { return g_SampleForTests_clazz; }
// Leaking this jclass as we cannot use LazyInstance from some threads.
jclass g_InnerStructB_clazz = NULL;
jclass InnerStructB_clazz(JNIEnv*) { return g_InnerStructB_clazz; }
#if __clang__
#pragma clang diagnostic pop
#endif
} // namespace
......@@ -99,11 +109,11 @@ static jint Java_SampleForTests_javaMethod(JNIEnv* env, jobject obj,
JniIntWrapper bar) {
/* Must call RegisterNativesImpl() */
CHECK_CLAZZ(env, obj,
g_SampleForTests_clazz, 0);
SampleForTests_clazz(env), 0);
jmethodID method_id =
base::android::MethodID::LazyGet<
base::android::MethodID::TYPE_INSTANCE>(
env, g_SampleForTests_clazz,
env, SampleForTests_clazz(env),
"javaMethod",
"("
......@@ -123,12 +133,12 @@ static jint Java_SampleForTests_javaMethod(JNIEnv* env, jobject obj,
static base::subtle::AtomicWord g_SampleForTests_staticJavaMethod = 0;
static jboolean Java_SampleForTests_staticJavaMethod(JNIEnv* env) {
/* Must call RegisterNativesImpl() */
CHECK_CLAZZ(env, g_SampleForTests_clazz,
g_SampleForTests_clazz, false);
CHECK_CLAZZ(env, SampleForTests_clazz(env),
SampleForTests_clazz(env), false);
jmethodID method_id =
base::android::MethodID::LazyGet<
base::android::MethodID::TYPE_STATIC>(
env, g_SampleForTests_clazz,
env, SampleForTests_clazz(env),
"staticJavaMethod",
"("
......@@ -137,7 +147,7 @@ static jboolean Java_SampleForTests_staticJavaMethod(JNIEnv* env) {
&g_SampleForTests_staticJavaMethod);
jboolean ret =
env->CallStaticBooleanMethod(g_SampleForTests_clazz,
env->CallStaticBooleanMethod(SampleForTests_clazz(env),
method_id);
jni_generator::CheckException(env);
return ret;
......@@ -148,11 +158,11 @@ static void Java_SampleForTests_packagePrivateJavaMethod(JNIEnv* env, jobject
obj) {
/* Must call RegisterNativesImpl() */
CHECK_CLAZZ(env, obj,
g_SampleForTests_clazz);
SampleForTests_clazz(env));
jmethodID method_id =
base::android::MethodID::LazyGet<
base::android::MethodID::TYPE_INSTANCE>(
env, g_SampleForTests_clazz,
env, SampleForTests_clazz(env),
"packagePrivateJavaMethod",
"("
......@@ -171,11 +181,11 @@ static void Java_SampleForTests_methodThatThrowsException(JNIEnv* env, jobject
obj) {
/* Must call RegisterNativesImpl() */
CHECK_CLAZZ(env, obj,
g_SampleForTests_clazz);
SampleForTests_clazz(env));
jmethodID method_id =
base::android::MethodID::LazyGet<
base::android::MethodID::TYPE_INSTANCE>(
env, g_SampleForTests_clazz,
env, SampleForTests_clazz(env),
"methodThatThrowsException",
"("
......@@ -194,12 +204,12 @@ static base::android::ScopedJavaLocalRef<jobject>
JniIntWrapper i,
jstring s) {
/* Must call RegisterNativesImpl() */
CHECK_CLAZZ(env, g_InnerStructA_clazz,
g_InnerStructA_clazz, NULL);
CHECK_CLAZZ(env, InnerStructA_clazz(env),
InnerStructA_clazz(env), NULL);
jmethodID method_id =
base::android::MethodID::LazyGet<
base::android::MethodID::TYPE_STATIC>(
env, g_InnerStructA_clazz,
env, InnerStructA_clazz(env),
"create",
"("
......@@ -211,7 +221,7 @@ static base::android::ScopedJavaLocalRef<jobject>
&g_InnerStructA_create);
jobject ret =
env->CallStaticObjectMethod(g_InnerStructA_clazz,
env->CallStaticObjectMethod(InnerStructA_clazz(env),
method_id, l, as_jint(i), s);
jni_generator::CheckException(env);
return base::android::ScopedJavaLocalRef<jobject>(env, ret);
......@@ -222,11 +232,11 @@ static void Java_SampleForTests_addStructA(JNIEnv* env, jobject obj, jobject a)
{
/* Must call RegisterNativesImpl() */
CHECK_CLAZZ(env, obj,
g_SampleForTests_clazz);
SampleForTests_clazz(env));
jmethodID method_id =
base::android::MethodID::LazyGet<
base::android::MethodID::TYPE_INSTANCE>(
env, g_SampleForTests_clazz,
env, SampleForTests_clazz(env),
"addStructA",
"("
......@@ -246,11 +256,11 @@ static void Java_SampleForTests_iterateAndDoSomething(JNIEnv* env, jobject obj)
{
/* Must call RegisterNativesImpl() */
CHECK_CLAZZ(env, obj,
g_SampleForTests_clazz);
SampleForTests_clazz(env));
jmethodID method_id =
base::android::MethodID::LazyGet<
base::android::MethodID::TYPE_INSTANCE>(
env, g_SampleForTests_clazz,
env, SampleForTests_clazz(env),
"iterateAndDoSomething",
"("
......@@ -268,11 +278,11 @@ static base::subtle::AtomicWord g_InnerStructB_getKey = 0;
static jlong Java_InnerStructB_getKey(JNIEnv* env, jobject obj) {
/* Must call RegisterNativesImpl() */
CHECK_CLAZZ(env, obj,
g_InnerStructB_clazz, 0);
InnerStructB_clazz(env), 0);
jmethodID method_id =
base::android::MethodID::LazyGet<
base::android::MethodID::TYPE_INSTANCE>(
env, g_InnerStructB_clazz,
env, InnerStructB_clazz(env),
"getKey",
"("
......@@ -292,11 +302,11 @@ static base::android::ScopedJavaLocalRef<jstring>
Java_InnerStructB_getValue(JNIEnv* env, jobject obj) {
/* Must call RegisterNativesImpl() */
CHECK_CLAZZ(env, obj,
g_InnerStructB_clazz, NULL);
InnerStructB_clazz(env), NULL);
jmethodID method_id =
base::android::MethodID::LazyGet<
base::android::MethodID::TYPE_INSTANCE>(
env, g_InnerStructB_clazz,
env, InnerStructB_clazz(env),
"getValue",
"("
......@@ -379,11 +389,11 @@ static bool RegisterNativesImpl(JNIEnv* env) {
const int kMethodsSampleForTestsSize = arraysize(kMethodsSampleForTests);
if (env->RegisterNatives(g_SampleForTests_clazz,
if (env->RegisterNatives(SampleForTests_clazz(env),
kMethodsSampleForTests,
kMethodsSampleForTestsSize) < 0) {
jni_generator::HandleRegistrationError(
env, g_SampleForTests_clazz, __FILE__);
env, SampleForTests_clazz(env), __FILE__);
return false;
}
......
......@@ -731,7 +731,7 @@ class InlHeaderFileGenerator(object):
def GetContent(self):
"""Returns the content of the JNI binding file."""
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
// found in the LICENSE file.
......@@ -947,11 +947,11 @@ ${CALLED_BY_NATIVES}
template = Template("""\
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}Size) < 0) {
jni_generator::HandleRegistrationError(
env, g_${JAVA_CLASS}_clazz, __FILE__);
env, ${JAVA_CLASS}_clazz(env), __FILE__);
return false;
}
""")
......@@ -1122,11 +1122,10 @@ static ${RETURN} ${NAME}(JNIEnv* env, ${PARAMS_IN_DECLARATION}) {"""
def GetCalledByNativeValues(self, called_by_native):
"""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:
first_param_in_declaration = ''
first_param_in_call = ('g_%s_clazz' %
(called_by_native.java_class_name or
self.class_name))
first_param_in_call = ('%s_clazz(env)' % java_class)
else:
first_param_in_declaration = ', jobject obj'
first_param_in_call = 'obj'
......@@ -1160,7 +1159,7 @@ static ${RETURN} ${NAME}(JNIEnv* env, ${PARAMS_IN_DECLARATION}) {"""
else:
return_clause = 'return ret;'
return {
'JAVA_CLASS': called_by_native.java_class_name or self.class_name,
'JAVA_CLASS': java_class,
'RETURN_TYPE': return_type,
'OPTIONAL_ERROR_RETURN': optional_error_return,
'RETURN_DECLARATION': return_declaration,
......@@ -1204,7 +1203,7 @@ static base::subtle::AtomicWord g_${JAVA_CLASS}_${METHOD_ID_VAR_NAME} = 0;
${FUNCTION_HEADER}
/* Must call RegisterNativesImpl() */
CHECK_CLAZZ(env, ${FIRST_PARAM_IN_CALL},
g_${JAVA_CLASS}_clazz${OPTIONAL_ERROR_RETURN});
${JAVA_CLASS}_clazz(env)${OPTIONAL_ERROR_RETURN});
jmethodID method_id =
${GET_METHOD_ID_IMPL}
${RETURN_DECLARATION}
......@@ -1263,22 +1262,56 @@ const char k${JAVA_CLASS}ClassPath[] = "${JNI_CLASS_PATH}";""")
}
ret += [template.substitute(values)]
ret += ''
for clazz in called_by_native_classes:
class_getter_methods = []
if self.options.native_exports:
template = Template("""\
// 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 = {
'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)
def GetFindClasses(self):
"""Returns the imlementation of FindClass for all known classes."""
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));""")
else:
if self.options.native_exports:
return '\n'
template = Template("""\
g_${JAVA_CLASS}_clazz = reinterpret_cast<jclass>(env->NewGlobalRef(
base::android::GetClass(env, k${JAVA_CLASS}ClassPath).obj()));""")
......@@ -1293,13 +1326,13 @@ jclass g_${JAVA_CLASS}_clazz = NULL;""")
if self.options.eager_called_by_natives:
template = Template("""\
env->Get${STATIC_METHOD_PART}MethodID(
g_${JAVA_CLASS}_clazz,
${JAVA_CLASS}_clazz(env),
"${JNI_NAME}", ${JNI_SIGNATURE});""")
else:
template = Template("""\
base::android::MethodID::LazyGet<
base::android::MethodID::TYPE_${STATIC}>(
env, g_${JAVA_CLASS}_clazz,
env, ${JAVA_CLASS}_clazz(env),
"${JNI_NAME}",
${JNI_SIGNATURE},
&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
// found in the LICENSE file.
......@@ -19,8 +19,16 @@
// Step 1: forward declarations.
namespace {
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.
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_testStaticMethodWithParam = NULL;
jmethodID g_Test_testMethodWithNoParam = NULL;
......@@ -46,20 +54,21 @@ static void testMethodWithParam(JNIEnv* env, jobject obj, 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));
return ret;
}
static jdouble testMethodWithNoParam(JNIEnv* env) {
jdouble ret = env->CallStaticDoubleMethod(g_Test_clazz,
jdouble ret = env->CallStaticDoubleMethod(Test_clazz(env),
g_Test_testMethodWithNoParam);
return ret;
}
static base::android::ScopedJavaLocalRef<jstring>
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));
return base::android::ScopedJavaLocalRef<jstring>(env, ret);
}
......@@ -81,16 +90,16 @@ static bool RegisterNativesImpl(JNIEnv* env, jclass clazz) {
const int kMethodsTestSize = arraysize(kMethodsTest);
if (env->RegisterNatives(g_Test_clazz,
if (env->RegisterNatives(Test_clazz(env),
kMethodsTest,
kMethodsTestSize) < 0) {
jni_generator::HandleRegistrationError(
env, g_Test_clazz, __FILE__);
env, Test_clazz(env), __FILE__);
return false;
}
g_Test_testMethodWithParam = env->GetMethodID(
g_Test_clazz,
Test_clazz(env),
"testMethodWithParam",
"("
"I"
......@@ -101,7 +110,7 @@ static bool RegisterNativesImpl(JNIEnv* env, jclass clazz) {
}
g_Test_testStaticMethodWithParam = env->GetStaticMethodID(
g_Test_clazz,
Test_clazz(env),
"testStaticMethodWithParam",
"("
"I"
......@@ -112,7 +121,7 @@ static bool RegisterNativesImpl(JNIEnv* env, jclass clazz) {
}
g_Test_testMethodWithNoParam = env->GetStaticMethodID(
g_Test_clazz,
Test_clazz(env),
"testMethodWithNoParam",
"("
")"
......@@ -122,7 +131,7 @@ static bool RegisterNativesImpl(JNIEnv* env, jclass clazz) {
}
g_Test_testStaticMethodWithNoParam = env->GetStaticMethodID(
g_Test_clazz,
Test_clazz(env),
"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
// found in the LICENSE file.
......@@ -19,8 +19,16 @@
// Step 1: forward declarations.
namespace {
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.
jclass g_InputStream_clazz = NULL;
jclass InputStream_clazz(JNIEnv*) { return g_InputStream_clazz; }
#if __clang__
#pragma clang diagnostic pop
#endif
} // namespace
......@@ -34,11 +42,11 @@ static jint Java_InputStream_available(JNIEnv* env, jobject obj) __attribute__
static jint Java_InputStream_available(JNIEnv* env, jobject obj) {
/* Must call RegisterNativesImpl() */
CHECK_CLAZZ(env, obj,
g_InputStream_clazz, 0);
InputStream_clazz(env), 0);
jmethodID method_id =
base::android::MethodID::LazyGet<
base::android::MethodID::TYPE_INSTANCE>(
env, g_InputStream_clazz,
env, InputStream_clazz(env),
"available",
"()I",
&g_InputStream_available);
......@@ -56,11 +64,11 @@ static void Java_InputStream_close(JNIEnv* env, jobject obj) __attribute__
static void Java_InputStream_close(JNIEnv* env, jobject obj) {
/* Must call RegisterNativesImpl() */
CHECK_CLAZZ(env, obj,
g_InputStream_clazz);
InputStream_clazz(env));
jmethodID method_id =
base::android::MethodID::LazyGet<
base::android::MethodID::TYPE_INSTANCE>(
env, g_InputStream_clazz,
env, InputStream_clazz(env),
"close",
"()V",
&g_InputStream_close);
......@@ -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) {
/* Must call RegisterNativesImpl() */
CHECK_CLAZZ(env, obj,
g_InputStream_clazz);
InputStream_clazz(env));
jmethodID method_id =
base::android::MethodID::LazyGet<
base::android::MethodID::TYPE_INSTANCE>(
env, g_InputStream_clazz,
env, InputStream_clazz(env),
"mark",
"(I)V",
&g_InputStream_mark);
......@@ -98,11 +106,11 @@ static jboolean Java_InputStream_markSupported(JNIEnv* env, jobject obj)
static jboolean Java_InputStream_markSupported(JNIEnv* env, jobject obj) {
/* Must call RegisterNativesImpl() */
CHECK_CLAZZ(env, obj,
g_InputStream_clazz, false);
InputStream_clazz(env), false);
jmethodID method_id =
base::android::MethodID::LazyGet<
base::android::MethodID::TYPE_INSTANCE>(
env, g_InputStream_clazz,
env, InputStream_clazz(env),
"markSupported",
"()Z",
&g_InputStream_markSupported);
......@@ -120,11 +128,11 @@ static jint Java_InputStream_readI(JNIEnv* env, jobject obj) __attribute__
static jint Java_InputStream_readI(JNIEnv* env, jobject obj) {
/* Must call RegisterNativesImpl() */
CHECK_CLAZZ(env, obj,
g_InputStream_clazz, 0);
InputStream_clazz(env), 0);
jmethodID method_id =
base::android::MethodID::LazyGet<
base::android::MethodID::TYPE_INSTANCE>(
env, g_InputStream_clazz,
env, InputStream_clazz(env),
"read",
"()I",
&g_InputStream_readI);
......@@ -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) {
/* Must call RegisterNativesImpl() */
CHECK_CLAZZ(env, obj,
g_InputStream_clazz, 0);
InputStream_clazz(env), 0);
jmethodID method_id =
base::android::MethodID::LazyGet<
base::android::MethodID::TYPE_INSTANCE>(
env, g_InputStream_clazz,
env, InputStream_clazz(env),
"read",
"([B)I",
&g_InputStream_readI_AB);
......@@ -169,11 +177,11 @@ static jint Java_InputStream_readI_AB_I_I(JNIEnv* env, jobject obj, jbyteArray
JniIntWrapper p2) {
/* Must call RegisterNativesImpl() */
CHECK_CLAZZ(env, obj,
g_InputStream_clazz, 0);
InputStream_clazz(env), 0);
jmethodID method_id =
base::android::MethodID::LazyGet<
base::android::MethodID::TYPE_INSTANCE>(
env, g_InputStream_clazz,
env, InputStream_clazz(env),
"read",
"([BII)I",
&g_InputStream_readI_AB_I_I);
......@@ -191,11 +199,11 @@ static void Java_InputStream_reset(JNIEnv* env, jobject obj) __attribute__
static void Java_InputStream_reset(JNIEnv* env, jobject obj) {
/* Must call RegisterNativesImpl() */
CHECK_CLAZZ(env, obj,
g_InputStream_clazz);
InputStream_clazz(env));
jmethodID method_id =
base::android::MethodID::LazyGet<
base::android::MethodID::TYPE_INSTANCE>(
env, g_InputStream_clazz,
env, InputStream_clazz(env),
"reset",
"()V",
&g_InputStream_reset);
......@@ -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) {
/* Must call RegisterNativesImpl() */
CHECK_CLAZZ(env, obj,
g_InputStream_clazz, 0);
InputStream_clazz(env), 0);
jmethodID method_id =
base::android::MethodID::LazyGet<
base::android::MethodID::TYPE_INSTANCE>(
env, g_InputStream_clazz,
env, InputStream_clazz(env),
"skip",
"(J)J",
&g_InputStream_skip);
......@@ -234,18 +242,18 @@ static base::android::ScopedJavaLocalRef<jobject>
static base::android::ScopedJavaLocalRef<jobject>
Java_InputStream_Constructor(JNIEnv* env) {
/* Must call RegisterNativesImpl() */
CHECK_CLAZZ(env, g_InputStream_clazz,
g_InputStream_clazz, NULL);
CHECK_CLAZZ(env, InputStream_clazz(env),
InputStream_clazz(env), NULL);
jmethodID method_id =
base::android::MethodID::LazyGet<
base::android::MethodID::TYPE_INSTANCE>(
env, g_InputStream_clazz,
env, InputStream_clazz(env),
"<init>",
"()V",
&g_InputStream_Constructor);
jobject ret =
env->NewObject(g_InputStream_clazz,
env->NewObject(InputStream_clazz(env),
method_id);
jni_generator::CheckException(env);
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
// found in the LICENSE file.
......@@ -19,8 +19,16 @@
// Step 1: forward declarations.
namespace {
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.
jclass g_HashSet_clazz = NULL;
jclass HashSet_clazz(JNIEnv*) { return g_HashSet_clazz; }
#if __clang__
#pragma clang diagnostic pop
#endif
} // namespace
......@@ -34,11 +42,11 @@ static void Java_HashSet_dummy(JNIEnv* env, jobject obj) __attribute__
static void Java_HashSet_dummy(JNIEnv* env, jobject obj) {
/* Must call RegisterNativesImpl() */
CHECK_CLAZZ(env, obj,
g_HashSet_clazz);
HashSet_clazz(env));
jmethodID method_id =
base::android::MethodID::LazyGet<
base::android::MethodID::TYPE_INSTANCE>(
env, g_HashSet_clazz,
env, HashSet_clazz(env),
"dummy",
"()V",
&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
// found in the LICENSE file.
......@@ -20,8 +20,16 @@
namespace {
const char kTestJniClassPath[] = "org/chromium/TestJni";
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.
jclass g_TestJni_clazz = NULL;
jclass TestJni_clazz(JNIEnv*) { return g_TestJni_clazz; }
#if __clang__
#pragma clang diagnostic pop
#endif
} // namespace
......@@ -44,11 +52,11 @@ static bool RegisterNativesImpl(JNIEnv* env) {
const int kMethodsMyInnerClassSize = arraysize(kMethodsMyInnerClass);
if (env->RegisterNatives(g_MyInnerClass_clazz,
if (env->RegisterNatives(MyInnerClass_clazz(env),
kMethodsMyInnerClass,
kMethodsMyInnerClassSize) < 0) {
jni_generator::HandleRegistrationError(
env, g_MyInnerClass_clazz, __FILE__);
env, MyInnerClass_clazz(env), __FILE__);
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
// found in the LICENSE file.
......@@ -21,8 +21,16 @@ namespace {
const char kMyOtherInnerClassClassPath[] =
"org/chromium/TestJni$MyOtherInnerClass";
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.
jclass g_TestJni_clazz = NULL;
jclass TestJni_clazz(JNIEnv*) { return g_TestJni_clazz; }
#if __clang__
#pragma clang diagnostic pop
#endif
} // namespace
......@@ -55,21 +63,21 @@ static bool RegisterNativesImpl(JNIEnv* env) {
const int kMethodsMyOtherInnerClassSize =
arraysize(kMethodsMyOtherInnerClass);
if (env->RegisterNatives(g_MyOtherInnerClass_clazz,
if (env->RegisterNatives(MyOtherInnerClass_clazz(env),
kMethodsMyOtherInnerClass,
kMethodsMyOtherInnerClassSize) < 0) {
jni_generator::HandleRegistrationError(
env, g_MyOtherInnerClass_clazz, __FILE__);
env, MyOtherInnerClass_clazz(env), __FILE__);
return false;
}
const int kMethodsTestJniSize = arraysize(kMethodsTestJni);
if (env->RegisterNatives(g_TestJni_clazz,
if (env->RegisterNatives(TestJni_clazz(env),
kMethodsTestJni,
kMethodsTestJniSize) < 0) {
jni_generator::HandleRegistrationError(
env, g_TestJni_clazz, __FILE__);
env, TestJni_clazz(env), __FILE__);
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
// found in the LICENSE file.
......@@ -22,8 +22,16 @@ const char kMyOtherInnerClassClassPath[] =
"org/chromium/TestJni$MyOtherInnerClass";
const char kTestJniClassPath[] = "org/chromium/TestJni";
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.
jclass g_TestJni_clazz = NULL;
jclass TestJni_clazz(JNIEnv*) { return g_TestJni_clazz; }
#if __clang__
#pragma clang diagnostic pop
#endif
} // namespace
......@@ -56,21 +64,21 @@ static bool RegisterNativesImpl(JNIEnv* env) {
const int kMethodsMyOtherInnerClassSize =
arraysize(kMethodsMyOtherInnerClass);
if (env->RegisterNatives(g_MyOtherInnerClass_clazz,
if (env->RegisterNatives(MyOtherInnerClass_clazz(env),
kMethodsMyOtherInnerClass,
kMethodsMyOtherInnerClassSize) < 0) {
jni_generator::HandleRegistrationError(
env, g_MyOtherInnerClass_clazz, __FILE__);
env, MyOtherInnerClass_clazz(env), __FILE__);
return false;
}
const int kMethodsMyInnerClassSize = arraysize(kMethodsMyInnerClass);
if (env->RegisterNatives(g_MyInnerClass_clazz,
if (env->RegisterNatives(MyInnerClass_clazz(env),
kMethodsMyInnerClass,
kMethodsMyInnerClassSize) < 0) {
jni_generator::HandleRegistrationError(
env, g_MyInnerClass_clazz, __FILE__);
env, MyInnerClass_clazz(env), __FILE__);
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
// found in the LICENSE file.
......@@ -19,8 +19,16 @@
// Step 1: forward declarations.
namespace {
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.
jclass g_Test_clazz = NULL;
jclass Test_clazz(JNIEnv*) { return g_Test_clazz; }
#if __clang__
#pragma clang diagnostic pop
#endif
} // namespace
......@@ -49,11 +57,11 @@ static bool RegisterNativesImpl(JNIEnv* env, jclass clazz) {
const int kMethodsTestSize = arraysize(kMethodsTest);
if (env->RegisterNatives(g_Test_clazz,
if (env->RegisterNatives(Test_clazz(env),
kMethodsTest,
kMethodsTestSize) < 0) {
jni_generator::HandleRegistrationError(
env, g_Test_clazz, __FILE__);
env, Test_clazz(env), __FILE__);
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
// found in the LICENSE file.
......@@ -19,8 +19,16 @@
// Step 1: forward declarations.
namespace {
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.
jclass g_Example_clazz = NULL;
jclass Example_clazz(JNIEnv*) { return g_Example_clazz; }
#if __clang__
#pragma clang diagnostic pop
#endif
} // namespace
......@@ -69,11 +77,11 @@ static bool RegisterNativesImpl(JNIEnv* env) {
const int kMethodsExampleSize = arraysize(kMethodsExample);
if (env->RegisterNatives(g_Example_clazz,
if (env->RegisterNatives(Example_clazz(env),
kMethodsExample,
kMethodsExampleSize) < 0) {
jni_generator::HandleRegistrationError(
env, g_Example_clazz, __FILE__);
env, Example_clazz(env), __FILE__);
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
// found in the LICENSE file.
......@@ -19,8 +19,16 @@
// Step 1: forward declarations.
namespace {
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.
jclass g_Foo_clazz = NULL;
jclass Foo_clazz(JNIEnv*) { return g_Foo_clazz; }
#if __clang__
#pragma clang diagnostic pop
#endif
} // namespace
......@@ -34,12 +42,12 @@ static base::subtle::AtomicWord g_Foo_calledByNative = 0;
static void Java_Foo_calledByNative(JNIEnv* env, jobject callback1,
jobject callback2) {
/* Must call RegisterNativesImpl() */
CHECK_CLAZZ(env, g_Foo_clazz,
g_Foo_clazz);
CHECK_CLAZZ(env, Foo_clazz(env),
Foo_clazz(env));
jmethodID method_id =
base::android::MethodID::LazyGet<
base::android::MethodID::TYPE_STATIC>(
env, g_Foo_clazz,
env, Foo_clazz(env),
"calledByNative",
"("
......@@ -49,7 +57,7 @@ static void Java_Foo_calledByNative(JNIEnv* env, jobject callback1,
"V",
&g_Foo_calledByNative);
env->CallStaticVoidMethod(g_Foo_clazz,
env->CallStaticVoidMethod(Foo_clazz(env),
method_id, callback1, callback2);
jni_generator::CheckException(env);
......@@ -72,11 +80,11 @@ static bool RegisterNativesImpl(JNIEnv* env) {
const int kMethodsFooSize = arraysize(kMethodsFoo);
if (env->RegisterNatives(g_Foo_clazz,
if (env->RegisterNatives(Foo_clazz(env),
kMethodsFoo,
kMethodsFooSize) < 0) {
jni_generator::HandleRegistrationError(
env, g_Foo_clazz, __FILE__);
env, Foo_clazz(env), __FILE__);
return false;
}
......
......@@ -20,8 +20,19 @@
namespace {
const char kSampleForTestsClassPath[] =
"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.
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
......@@ -79,11 +90,11 @@ static void Java_SampleForTests_testMethodWithParam(JNIEnv* env, jobject obj,
JniIntWrapper iParam) {
/* Must call RegisterNativesImpl() */
CHECK_CLAZZ(env, obj,
g_SampleForTests_clazz);
SampleForTests_clazz(env));
jmethodID method_id =
base::android::MethodID::LazyGet<
base::android::MethodID::TYPE_INSTANCE>(
env, g_SampleForTests_clazz,
env, SampleForTests_clazz(env),
"testMethodWithParam",
"("
......@@ -105,11 +116,11 @@ static base::android::ScopedJavaLocalRef<jstring>
JniIntWrapper iParam) {
/* Must call RegisterNativesImpl() */
CHECK_CLAZZ(env, obj,
g_SampleForTests_clazz, NULL);
SampleForTests_clazz(env), NULL);
jmethodID method_id =
base::android::MethodID::LazyGet<
base::android::MethodID::TYPE_INSTANCE>(
env, g_SampleForTests_clazz,
env, SampleForTests_clazz(env),
"testMethodWithParamAndReturn",
"("
......@@ -129,12 +140,12 @@ static base::subtle::AtomicWord g_SampleForTests_testStaticMethodWithParam = 0;
static jint Java_SampleForTests_testStaticMethodWithParam(JNIEnv* env,
JniIntWrapper iParam) {
/* Must call RegisterNativesImpl() */
CHECK_CLAZZ(env, g_SampleForTests_clazz,
g_SampleForTests_clazz, 0);
CHECK_CLAZZ(env, SampleForTests_clazz(env),
SampleForTests_clazz(env), 0);
jmethodID method_id =
base::android::MethodID::LazyGet<
base::android::MethodID::TYPE_STATIC>(
env, g_SampleForTests_clazz,
env, SampleForTests_clazz(env),
"testStaticMethodWithParam",
"("
......@@ -144,7 +155,7 @@ static jint Java_SampleForTests_testStaticMethodWithParam(JNIEnv* env,
&g_SampleForTests_testStaticMethodWithParam);
jint ret =
env->CallStaticIntMethod(g_SampleForTests_clazz,
env->CallStaticIntMethod(SampleForTests_clazz(env),
method_id, as_jint(iParam));
jni_generator::CheckException(env);
return ret;
......@@ -153,12 +164,12 @@ static jint Java_SampleForTests_testStaticMethodWithParam(JNIEnv* env,
static base::subtle::AtomicWord g_SampleForTests_testMethodWithNoParam = 0;
static jdouble Java_SampleForTests_testMethodWithNoParam(JNIEnv* env) {
/* Must call RegisterNativesImpl() */
CHECK_CLAZZ(env, g_SampleForTests_clazz,
g_SampleForTests_clazz, 0);
CHECK_CLAZZ(env, SampleForTests_clazz(env),
SampleForTests_clazz(env), 0);
jmethodID method_id =
base::android::MethodID::LazyGet<
base::android::MethodID::TYPE_STATIC>(
env, g_SampleForTests_clazz,
env, SampleForTests_clazz(env),
"testMethodWithNoParam",
"("
......@@ -167,7 +178,7 @@ static jdouble Java_SampleForTests_testMethodWithNoParam(JNIEnv* env) {
&g_SampleForTests_testMethodWithNoParam);
jdouble ret =
env->CallStaticDoubleMethod(g_SampleForTests_clazz,
env->CallStaticDoubleMethod(SampleForTests_clazz(env),
method_id);
jni_generator::CheckException(env);
return ret;
......@@ -178,12 +189,12 @@ static base::subtle::AtomicWord g_SampleForTests_testStaticMethodWithNoParam =
static base::android::ScopedJavaLocalRef<jstring>
Java_SampleForTests_testStaticMethodWithNoParam(JNIEnv* env) {
/* Must call RegisterNativesImpl() */
CHECK_CLAZZ(env, g_SampleForTests_clazz,
g_SampleForTests_clazz, NULL);
CHECK_CLAZZ(env, SampleForTests_clazz(env),
SampleForTests_clazz(env), NULL);
jmethodID method_id =
base::android::MethodID::LazyGet<
base::android::MethodID::TYPE_STATIC>(
env, g_SampleForTests_clazz,
env, SampleForTests_clazz(env),
"testStaticMethodWithNoParam",
"("
......@@ -192,7 +203,7 @@ static base::android::ScopedJavaLocalRef<jstring>
&g_SampleForTests_testStaticMethodWithNoParam);
jstring ret =
static_cast<jstring>(env->CallStaticObjectMethod(g_SampleForTests_clazz,
static_cast<jstring>(env->CallStaticObjectMethod(SampleForTests_clazz(env),
method_id));
jni_generator::CheckException(env);
return base::android::ScopedJavaLocalRef<jstring>(env, ret);
......@@ -202,7 +213,8 @@ static base::android::ScopedJavaLocalRef<jstring>
// Step 3: RegisterNatives.
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;
}
......
// 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
// found in the LICENSE file.
......@@ -19,8 +19,16 @@
// Step 1: forward declarations.
namespace {
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.
jclass g_TestJni_clazz = NULL;
jclass TestJni_clazz(JNIEnv*) { return g_TestJni_clazz; }
#if __clang__
#pragma clang diagnostic pop
#endif
} // namespace
......@@ -202,11 +210,11 @@ static bool RegisterNativesImpl(JNIEnv* env) {
const int kMethodsTestJniSize = arraysize(kMethodsTestJni);
if (env->RegisterNatives(g_TestJni_clazz,
if (env->RegisterNatives(TestJni_clazz(env),
kMethodsTestJni,
kMethodsTestJniSize) < 0) {
jni_generator::HandleRegistrationError(
env, g_TestJni_clazz, __FILE__);
env, TestJni_clazz(env), __FILE__);
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
// found in the LICENSE file.
......@@ -19,8 +19,16 @@
// Step 1: forward declarations.
namespace {
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.
jclass g_TestJni_clazz = NULL;
jclass TestJni_clazz(JNIEnv*) { return g_TestJni_clazz; }
#if __clang__
#pragma clang diagnostic pop
#endif
} // namespace
......@@ -49,11 +57,11 @@ static bool RegisterNativesImpl(JNIEnv* env) {
const int kMethodsTestJniSize = arraysize(kMethodsTestJni);
if (env->RegisterNatives(g_TestJni_clazz,
if (env->RegisterNatives(TestJni_clazz(env),
kMethodsTestJni,
kMethodsTestJniSize) < 0) {
jni_generator::HandleRegistrationError(
env, g_TestJni_clazz, __FILE__);
env, TestJni_clazz(env), __FILE__);
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
// found in the LICENSE file.
......@@ -19,8 +19,16 @@
// Step 1: forward declarations.
namespace {
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.
jclass g_Test_clazz = NULL;
jclass Test_clazz(JNIEnv*) { return g_Test_clazz; }
#if __clang__
#pragma clang diagnostic pop
#endif
} // namespace
......@@ -50,11 +58,11 @@ static bool RegisterNativesImpl(JNIEnv* env) {
const int kMethodsTestSize = arraysize(kMethodsTest);
if (env->RegisterNatives(g_Test_clazz,
if (env->RegisterNatives(Test_clazz(env),
kMethodsTest,
kMethodsTestSize) < 0) {
jni_generator::HandleRegistrationError(
env, g_Test_clazz, __FILE__);
env, Test_clazz(env), __FILE__);
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
// found in the LICENSE file.
......@@ -19,8 +19,16 @@
// Step 1: forward declarations.
namespace {
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.
jclass g_Foo_clazz = NULL;
jclass Foo_clazz(JNIEnv*) { return g_Foo_clazz; }
#if __clang__
#pragma clang diagnostic pop
#endif
} // namespace
......@@ -32,12 +40,12 @@ static void DoSomething(JNIEnv* env, jclass jcaller,
static base::subtle::AtomicWord g_Foo_calledByNative = 0;
static void Java_Foo_calledByNative(JNIEnv* env, jobject callback) {
/* Must call RegisterNativesImpl() */
CHECK_CLAZZ(env, g_Foo_clazz,
g_Foo_clazz);
CHECK_CLAZZ(env, Foo_clazz(env),
Foo_clazz(env));
jmethodID method_id =
base::android::MethodID::LazyGet<
base::android::MethodID::TYPE_STATIC>(
env, g_Foo_clazz,
env, Foo_clazz(env),
"calledByNative",
"("
......@@ -46,7 +54,7 @@ static void Java_Foo_calledByNative(JNIEnv* env, jobject callback) {
"V",
&g_Foo_calledByNative);
env->CallStaticVoidMethod(g_Foo_clazz,
env->CallStaticVoidMethod(Foo_clazz(env),
method_id, callback);
jni_generator::CheckException(env);
......@@ -68,11 +76,11 @@ static bool RegisterNativesImpl(JNIEnv* env) {
const int kMethodsFooSize = arraysize(kMethodsFoo);
if (env->RegisterNatives(g_Foo_clazz,
if (env->RegisterNatives(Foo_clazz(env),
kMethodsFoo,
kMethodsFooSize) < 0) {
jni_generator::HandleRegistrationError(
env, g_Foo_clazz, __FILE__);
env, Foo_clazz(env), __FILE__);
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 @@
'android/java/src/org/chromium/base/EventLog.java',
'android/java/src/org/chromium/base/FieldTrialList.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/MemoryPressureListener.java',
'android/java/src/org/chromium/base/JavaHandlerThread.java',
......
......@@ -55,6 +55,8 @@
'android/jni_registrar.h',
'android/jni_string.cc',
'android/jni_string.h',
'android/jni_utils.cc',
'android/jni_utils.h',
'android/jni_weak_ref.cc',
'android/jni_weak_ref.h',
'android/library_loader/library_loader_hooks.cc',
......
......@@ -32,7 +32,7 @@ ScopedJavaSurface::ScopedJavaSurface(
is_protected_(false) {
JNIEnv* env = base::android::AttachCurrentThread();
RegisterNativesIfNeeded(env);
DCHECK(env->IsInstanceOf(surface.obj(), g_Surface_clazz));
DCHECK(env->IsInstanceOf(surface.obj(), Surface_clazz(env)));
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