Commit 8ee9d324 authored by xunjieli's avatar xunjieli Committed by Commit bot

Use @NativeClassQualifiedName in CronetUrlRequestContext.java

This CL uses @NativeClassQualifiedName in CronetUrlRequestContext.java to reduce
JNI code. After the refactoring, cronet_url_request_context.cc is merged
with cronet_url_request_context_adapter.cc, since the former mostly contains
JNI code that will be generated by @NativeClassQualifiedName.

BUG=458276

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

Cr-Commit-Position: refs/heads/master@{#317068}
parent d6e65341
......@@ -128,8 +128,6 @@
'cronet/android/cronet_url_request.h',
'cronet/android/cronet_url_request_adapter.cc',
'cronet/android/cronet_url_request_adapter.h',
'cronet/android/cronet_url_request_context.cc',
'cronet/android/cronet_url_request_context.h',
'cronet/android/cronet_url_request_context_adapter.cc',
'cronet/android/cronet_url_request_context_adapter.h',
'cronet/android/url_request_adapter.cc',
......
......@@ -16,7 +16,7 @@
#include "components/cronet/android/chromium_url_request_context.h"
#include "components/cronet/android/cronet_histogram_manager.h"
#include "components/cronet/android/cronet_url_request.h"
#include "components/cronet/android/cronet_url_request_context.h"
#include "components/cronet/android/cronet_url_request_context_adapter.h"
#include "jni/CronetLibraryLoader_jni.h"
#include "net/android/net_jni_registrar.h"
#include "net/android/network_change_notifier_factory_android.h"
......@@ -38,7 +38,8 @@ const base::android::RegistrationMethod kCronetRegisteredMethods[] = {
{"CronetHistogramManager", CronetHistogramManagerRegisterJni},
{"CronetLibraryLoader", RegisterNativesImpl},
{"CronetUrlRequest", CronetUrlRequestRegisterJni},
{"CronetUrlRequestContext", CronetUrlRequestContextRegisterJni},
{"CronetUrlRequestContextAdapter",
CronetUrlRequestContextAdapterRegisterJni},
{"NetAndroid", net::android::RegisterJni},
{"UrlAndroid", url::android::RegisterJni},
};
......
// 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 "components/cronet/android/cronet_url_request_context.h"
#include <string>
#include "base/android/jni_android.h"
#include "base/android/jni_string.h"
#include "base/android/scoped_java_ref.h"
#include "base/logging.h"
#include "base/memory/scoped_ptr.h"
#include "base/metrics/statistics_recorder.h"
#include "base/values.h"
#include "components/cronet/android/cronet_url_request.h"
#include "components/cronet/android/cronet_url_request_adapter.h"
#include "components/cronet/android/cronet_url_request_context_adapter.h"
#include "components/cronet/url_request_context_config.h"
#include "jni/CronetUrlRequestContext_jni.h"
namespace cronet {
// Init network thread on Java side.
void initJavaNetworkThread(
const base::android::ScopedJavaGlobalRef<jobject>& jowner) {
JNIEnv* env = base::android::AttachCurrentThread();
Java_CronetUrlRequestContext_initNetworkThread(env, jowner.obj());
}
// Explicitly register static JNI functions.
bool CronetUrlRequestContextRegisterJni(JNIEnv* env) {
return RegisterNativesImpl(env);
}
// Creates RequestContextAdater if config is valid URLRequestContextConfig,
// returns 0 otherwise.
static jlong CreateRequestContextAdapter(JNIEnv* env,
jobject jcaller,
jobject japp_context,
jstring jconfig) {
std::string config_string =
base::android::ConvertJavaStringToUTF8(env, jconfig);
scoped_ptr<URLRequestContextConfig> context_config(
new URLRequestContextConfig());
if (!context_config->LoadFromJSON(config_string))
return 0;
CronetURLRequestContextAdapter* context_adapter =
new CronetURLRequestContextAdapter(context_config.Pass());
return reinterpret_cast<jlong>(context_adapter);
}
// Destroys native objects.
static void DestroyRequestContextAdapter(JNIEnv* env,
jobject jcaller,
jlong jurl_request_context_adapter) {
DCHECK(jurl_request_context_adapter);
CronetURLRequestContextAdapter* context_adapter =
reinterpret_cast<CronetURLRequestContextAdapter*>(
jurl_request_context_adapter);
context_adapter->Destroy();
}
// Starts recording NetLog into file with |fileName|.
static void StartNetLogToFile(JNIEnv* env,
jobject jcaller,
jlong jurl_request_context_adapter,
jstring jfile_name) {
if (jurl_request_context_adapter == 0)
return;
CronetURLRequestContextAdapter* context_adapter =
reinterpret_cast<CronetURLRequestContextAdapter*>(
jurl_request_context_adapter);
std::string file_name =
base::android::ConvertJavaStringToUTF8(env, jfile_name);
context_adapter->StartNetLogToFile(file_name);
}
// Stops recording NetLog.
static void StopNetLog(JNIEnv* env,
jobject jcaller,
jlong jurl_request_context_adapter) {
if (jurl_request_context_adapter == 0)
return;
CronetURLRequestContextAdapter* context_adapter =
reinterpret_cast<CronetURLRequestContextAdapter*>(
jurl_request_context_adapter);
context_adapter->StopNetLog();
}
static jint SetMinLogLevel(JNIEnv* env, jobject jcaller, jint jlog_level) {
jint old_log_level = static_cast<jint>(logging::GetMinLogLevel());
// MinLogLevel is global, shared by all URLRequestContexts.
logging::SetMinLogLevel(static_cast<int>(jlog_level));
return old_log_level;
}
// Called on application's main Java thread.
static void InitRequestContextOnMainThread(JNIEnv* env,
jobject jcaller,
jlong jurl_request_context_adapter) {
if (jurl_request_context_adapter == 0)
return;
CronetURLRequestContextAdapter* context_adapter =
reinterpret_cast<CronetURLRequestContextAdapter*>(
jurl_request_context_adapter);
base::android::ScopedJavaGlobalRef<jobject> jcaller_ref;
jcaller_ref.Reset(env, jcaller);
base::Closure init_java_network_thread = base::Bind(&initJavaNetworkThread,
jcaller_ref);
context_adapter->InitRequestContextOnMainThread(init_java_network_thread);
}
} // namespace cronet
// 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 COMPONENTS_CRONET_ANDROID_CRONET_URL_REQUEST_CONTEXT_H_
#define COMPONENTS_CRONET_ANDROID_CRONET_URL_REQUEST_CONTEXT_H_
#include <jni.h>
namespace cronet {
bool CronetUrlRequestContextRegisterJni(JNIEnv* env);
} // namespace cronet
#endif // COMPONENTS_CRONET_ANDROID_CRONET_URL_REQUEST_CONTEXT_H_
......@@ -4,26 +4,24 @@
#include "components/cronet/android/cronet_url_request_context_adapter.h"
#include "base/android/jni_android.h"
#include "base/android/jni_string.h"
#include "base/bind.h"
#include "base/files/file_util.h"
#include "base/logging.h"
#include "base/single_thread_task_runner.h"
#include "base/values.h"
#include "components/cronet/url_request_context_config.h"
#include "jni/CronetUrlRequestContext_jni.h"
#include "net/base/load_flags.h"
#include "net/base/net_errors.h"
#include "net/base/net_log_logger.h"
#include "net/base/network_delegate_impl.h"
#include "net/cert/cert_verifier.h"
#include "net/http/http_auth_handler_factory.h"
#include "net/http/http_network_layer.h"
#include "net/http/http_server_properties.h"
#include "net/proxy/proxy_config_service_fixed.h"
#include "net/proxy/proxy_service.h"
#include "net/ssl/ssl_config_service_defaults.h"
#include "net/url_request/static_http_user_agent_settings.h"
#include "net/url_request/url_request_context.h"
#include "net/url_request/url_request_context_builder.h"
#include "net/url_request/url_request_context_storage.h"
#include "net/url_request/url_request_job_factory_impl.h"
namespace {
......@@ -108,6 +106,11 @@ class BasicNetworkDelegate : public net::NetworkDelegateImpl {
namespace cronet {
// Explicitly register static JNI functions.
bool CronetUrlRequestContextAdapterRegisterJni(JNIEnv* env) {
return RegisterNativesImpl(env);
}
CronetURLRequestContextAdapter::CronetURLRequestContextAdapter(
scoped_ptr<URLRequestContextConfig> context_config)
: network_thread_(new base::Thread("network")),
......@@ -125,20 +128,23 @@ CronetURLRequestContextAdapter::~CronetURLRequestContextAdapter() {
}
void CronetURLRequestContextAdapter::InitRequestContextOnMainThread(
const base::Closure& java_init_network_thread) {
JNIEnv* env,
jobject jcaller) {
base::android::ScopedJavaGlobalRef<jobject> jcaller_ref;
jcaller_ref.Reset(env, jcaller);
proxy_config_service_.reset(net::ProxyService::CreateSystemProxyConfigService(
GetNetworkTaskRunner(), nullptr));
GetNetworkTaskRunner()->PostTask(
FROM_HERE,
base::Bind(&CronetURLRequestContextAdapter::InitializeOnNetworkThread,
base::Unretained(this),
Passed(&context_config_),
java_init_network_thread));
base::Unretained(this), Passed(&context_config_),
jcaller_ref));
}
void CronetURLRequestContextAdapter::InitializeOnNetworkThread(
scoped_ptr<URLRequestContextConfig> config,
const base::Closure& java_init_network_thread) {
const base::android::ScopedJavaGlobalRef<jobject>&
jcronet_url_request_context) {
DCHECK(GetNetworkTaskRunner()->BelongsToCurrentThread());
DCHECK(!is_context_initialized_);
// TODO(mmenke): Add method to have the builder enable SPDY.
......@@ -199,7 +205,9 @@ void CronetURLRequestContextAdapter::InitializeOnNetworkThread(
}
}
java_init_network_thread.Run();
JNIEnv* env = base::android::AttachCurrentThread();
Java_CronetUrlRequestContext_initNetworkThread(
env, jcronet_url_request_context.obj());
is_context_initialized_ = true;
while (!tasks_waiting_for_context_.empty()) {
......@@ -208,7 +216,7 @@ void CronetURLRequestContextAdapter::InitializeOnNetworkThread(
}
}
void CronetURLRequestContextAdapter::Destroy() {
void CronetURLRequestContextAdapter::Destroy(JNIEnv* env, jobject jcaller) {
DCHECK(!GetNetworkTaskRunner()->BelongsToCurrentThread());
// Stick network_thread_ in a local, as |this| may be destroyed from the
// network thread before delete network_thread is called.
......@@ -254,17 +262,18 @@ CronetURLRequestContextAdapter::GetNetworkTaskRunner() const {
return network_thread_->task_runner();
}
void CronetURLRequestContextAdapter::StartNetLogToFile(
const std::string& file_name) {
void CronetURLRequestContextAdapter::StartNetLogToFile(JNIEnv* env,
jobject jcaller,
jstring jfile_name) {
GetNetworkTaskRunner()->PostTask(
FROM_HERE,
base::Bind(
&CronetURLRequestContextAdapter::StartNetLogToFileOnNetworkThread,
base::Unretained(this),
file_name));
base::android::ConvertJavaStringToUTF8(env, jfile_name)));
}
void CronetURLRequestContextAdapter::StopNetLog() {
void CronetURLRequestContextAdapter::StopNetLog(JNIEnv* env, jobject jcaller) {
GetNetworkTaskRunner()->PostTask(
FROM_HERE,
base::Bind(&CronetURLRequestContextAdapter::StopNetLogOnNetworkThread,
......@@ -296,4 +305,29 @@ void CronetURLRequestContextAdapter::StopNetLogOnNetworkThread() {
}
}
// Creates RequestContextAdater if config is valid URLRequestContextConfig,
// returns 0 otherwise.
static jlong CreateRequestContextAdapter(JNIEnv* env,
jclass jcaller,
jobject japp_context,
jstring jconfig) {
std::string config_string =
base::android::ConvertJavaStringToUTF8(env, jconfig);
scoped_ptr<URLRequestContextConfig> context_config(
new URLRequestContextConfig());
if (!context_config->LoadFromJSON(config_string))
return 0;
CronetURLRequestContextAdapter* context_adapter =
new CronetURLRequestContextAdapter(context_config.Pass());
return reinterpret_cast<jlong>(context_adapter);
}
static jint SetMinLogLevel(JNIEnv* env, jclass jcaller, jint jlog_level) {
jint old_log_level = static_cast<jint>(logging::GetMinLogLevel());
// MinLogLevel is global, shared by all URLRequestContexts.
logging::SetMinLogLevel(static_cast<int>(jlog_level));
return old_log_level;
}
} // namespace cronet
......@@ -5,16 +5,17 @@
#ifndef COMPONENTS_CRONET_ANDROID_CRONET_URL_REQUEST_CONTEXT_ADAPTER_H_
#define COMPONENTS_CRONET_ANDROID_CRONET_URL_REQUEST_CONTEXT_ADAPTER_H_
#include <jni.h>
#include <queue>
#include <string>
#include "base/android/scoped_java_ref.h"
#include "base/callback.h"
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "base/memory/scoped_ptr.h"
#include "base/threading/thread.h"
#include "net/base/net_log.h"
#include "net/base/network_change_notifier.h"
namespace base {
class SingleThreadTaskRunner;
......@@ -30,6 +31,8 @@ namespace cronet {
struct URLRequestContextConfig;
bool CronetUrlRequestContextAdapterRegisterJni(JNIEnv* env);
// Adapter between Java CronetUrlRequestContext and net::URLRequestContext.
class CronetURLRequestContextAdapter {
public:
......@@ -39,12 +42,11 @@ class CronetURLRequestContextAdapter {
~CronetURLRequestContextAdapter();
// Called on main Java thread to initialize URLRequestContext.
void InitRequestContextOnMainThread(
const base::Closure& java_init_network_thread);
void InitRequestContextOnMainThread(JNIEnv* env, jobject jcaller);
// Releases all resources for the request context and deletes the object.
// Blocks until network thread is destroyed after running all pending tasks.
void Destroy();
void Destroy(JNIEnv* env, jobject jcaller);
// Posts a task that might depend on the context being initialized
// to the network thread.
......@@ -55,9 +57,9 @@ class CronetURLRequestContextAdapter {
net::URLRequestContext* GetURLRequestContext();
void StartNetLogToFile(const std::string& file_name);
void StartNetLogToFile(JNIEnv* env, jobject jcaller, jstring jfile_name);
void StopNetLog();
void StopNetLog(JNIEnv* env, jobject jcaller);
// Default net::LOAD flags used to create requests.
int default_load_flags() const { return default_load_flags_; }
......@@ -67,9 +69,9 @@ class CronetURLRequestContextAdapter {
private:
// Initializes |context_| on the Network thread.
void InitializeOnNetworkThread(
scoped_ptr<URLRequestContextConfig> config,
const base::Closure& java_init_network_thread);
void InitializeOnNetworkThread(scoped_ptr<URLRequestContextConfig> config,
const base::android::ScopedJavaGlobalRef<
jobject>& jcronet_url_request_context);
// Runs a task that might depend on the context being initialized.
// This method should only be run on the network thread.
......
......@@ -14,6 +14,7 @@ import android.util.Log;
import org.chromium.base.CalledByNative;
import org.chromium.base.JNINamespace;
import org.chromium.base.NativeClassQualifiedName;
import java.util.concurrent.Executor;
import java.util.concurrent.atomic.AtomicInteger;
......@@ -112,7 +113,7 @@ public class CronetUrlRequestContext extends UrlRequestContext {
if (!haveRequestContextAdapter()) {
return;
}
nativeDestroyRequestContextAdapter(mUrlRequestContextAdapter);
nativeDestroy(mUrlRequestContextAdapter);
mUrlRequestContextAdapter = 0;
}
}
......@@ -194,19 +195,21 @@ public class CronetUrlRequestContext extends UrlRequestContext {
}
// Native methods are implemented in cronet_url_request_context.cc.
private native long nativeCreateRequestContextAdapter(Context context,
String config);
private static native long nativeCreateRequestContextAdapter(
Context context, String config);
private native void nativeDestroyRequestContextAdapter(
long urlRequestContextAdapter);
private static native int nativeSetMinLogLevel(int loggingLevel);
private native void nativeStartNetLogToFile(
long urlRequestContextAdapter, String fileName);
@NativeClassQualifiedName("CronetURLRequestContextAdapter")
private native void nativeDestroy(long nativePtr);
private native void nativeStopNetLog(long urlRequestContextAdapter);
@NativeClassQualifiedName("CronetURLRequestContextAdapter")
private native void nativeStartNetLogToFile(long nativePtr,
String fileName);
private native int nativeSetMinLogLevel(int loggingLevel);
@NativeClassQualifiedName("CronetURLRequestContextAdapter")
private native void nativeStopNetLog(long nativePtr);
private native void nativeInitRequestContextOnMainThread(
long urlRequestContextAdapter);
@NativeClassQualifiedName("CronetURLRequestContextAdapter")
private native void nativeInitRequestContextOnMainThread(long nativePtr);
}
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