1 // Copyright (c) 2010 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "android/jni/jni_utils.h"
6 #include "android/jni/platform_file_jni.h"
7 #include "base/file_path.h"
8 #include "base/logging.h"
9
10 namespace android {
11
JavaISWrapper(const FilePath & path)12 JavaISWrapper::JavaISWrapper(const FilePath& path) {
13 JNIEnv* env = jni::GetJNIEnv();
14 jclass inputStreamClass = env->FindClass("java/io/InputStream");
15 m_read = env->GetMethodID(inputStreamClass, "read", "([B)I");
16 m_close = env->GetMethodID(inputStreamClass, "close", "()V");
17
18 jclass bridgeClass = env->FindClass("android/webkit/JniUtil");
19 jmethodID method = env->GetStaticMethodID(
20 bridgeClass,
21 "contentUrlStream",
22 "(Ljava/lang/String;)Ljava/io/InputStream;");
23 m_inputStream = env->NewGlobalRef(env->CallStaticObjectMethod(
24 bridgeClass,
25 method,
26 jni::ConvertUTF8ToJavaString(env, path.value())));
27 env->DeleteLocalRef(bridgeClass);
28 env->DeleteLocalRef(inputStreamClass);
29 }
30
~JavaISWrapper()31 JavaISWrapper::~JavaISWrapper() {
32 JNIEnv* env = jni::GetJNIEnv();
33 env->CallVoidMethod(m_inputStream, m_close);
34 jni::CheckException(env);
35 env->DeleteGlobalRef(m_inputStream);
36 }
37
Read(char * out,int length)38 int JavaISWrapper::Read(char* out, int length) {
39 JNIEnv* env = jni::GetJNIEnv();
40 jbyteArray buffer = env->NewByteArray(length);
41
42 int size = (int) env->CallIntMethod(m_inputStream, m_read, buffer);
43 if (jni::CheckException(env) || size < 0) {
44 env->DeleteLocalRef(buffer);
45 return 0;
46 }
47
48 env->GetByteArrayRegion(buffer, 0, size, (jbyte*)out);
49 env->DeleteLocalRef(buffer);
50 return size;
51 }
52
contentUrlSize(const FilePath & name)53 uint64 contentUrlSize(const FilePath& name) {
54 JNIEnv* env = jni::GetJNIEnv();
55 jclass bridgeClass = env->FindClass("android/webkit/JniUtil");
56 jmethodID method = env->GetStaticMethodID(
57 bridgeClass,
58 "contentUrlSize",
59 "(Ljava/lang/String;)J");
60 jlong length = env->CallStaticLongMethod(
61 bridgeClass,
62 method,
63 jni::ConvertUTF8ToJavaString(env, name.value()));
64 env->DeleteLocalRef(bridgeClass);
65
66 return static_cast<uint64>(length);
67 }
68
69 }
70
71