1dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/*
2dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Copyright (C) 2011 The Android Open Source Project
3dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *
4dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * you may not use this file except in compliance with the License.
6dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * You may obtain a copy of the License at
7dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *
8dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *
10dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * See the License for the specific language governing permissions and
14dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * limitations under the License.
15dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */
16dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
1714d0c6c7c0e9abd39e4b4d0a384d12de5ecbdbfcJeff Brown#include "jni/jni_native_buffer.h"
18dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "jni/jni_util.h"
19dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
20dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectchar* GetJBufferData(JNIEnv* env, jobject buffer, int* size) {
21dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project  jclass base_class = env->FindClass("android/filterfw/core/NativeBuffer");
22dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
23dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project  // Get fields
24dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project  jfieldID ptr_field = env->GetFieldID(base_class, "mDataPointer", "J");
25dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project  jfieldID size_field = env->GetFieldID(base_class, "mSize", "I");
26f6eba8fac812c70087af225f207f2d924f6e1ffaErik Gilling
27f6eba8fac812c70087af225f207f2d924f6e1ffaErik Gilling  // Get their values
28f6eba8fac812c70087af225f207f2d924f6e1ffaErik Gilling  char* data = reinterpret_cast<char*>(env->GetLongField(buffer, ptr_field));
29f6eba8fac812c70087af225f207f2d924f6e1ffaErik Gilling  if (size) {
30dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    *size = env->GetIntField(buffer, size_field);
31dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project  }
32dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
33dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project  // Clean-up
34dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project  env->DeleteLocalRef(base_class);
35dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
36dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project  return data;
37dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
38dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
39dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectbool AttachDataToJBuffer(JNIEnv* env, jobject buffer, char* data, int size) {
40dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project  jclass base_class = env->FindClass("android/filterfw/core/NativeBuffer");
41dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
42dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project  // Get fields
43f6eba8fac812c70087af225f207f2d924f6e1ffaErik Gilling  jfieldID ptr_field = env->GetFieldID(base_class, "mDataPointer", "J");
44f6eba8fac812c70087af225f207f2d924f6e1ffaErik Gilling  jfieldID size_field = env->GetFieldID(base_class, "mSize", "I");
45dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
46dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project  // Set their values
47dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project  env->SetLongField(buffer, ptr_field, reinterpret_cast<jlong>(data));
48f6eba8fac812c70087af225f207f2d924f6e1ffaErik Gilling  env->SetIntField(buffer, size_field, size);
49f6eba8fac812c70087af225f207f2d924f6e1ffaErik Gilling
50f6eba8fac812c70087af225f207f2d924f6e1ffaErik Gilling  return true;
51f6eba8fac812c70087af225f207f2d924f6e1ffaErik Gilling}
52f6eba8fac812c70087af225f207f2d924f6e1ffaErik Gilling
53f6eba8fac812c70087af225f207f2d924f6e1ffaErik Gillingjboolean Java_android_filterfw_core_NativeBuffer_allocate(JNIEnv* env, jobject thiz, jint size) {
54f6eba8fac812c70087af225f207f2d924f6e1ffaErik Gilling  char* data = new char[size];
55f6eba8fac812c70087af225f207f2d924f6e1ffaErik Gilling  return ToJBool(AttachDataToJBuffer(env, thiz, data, size));
56dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
57dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
58dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectjboolean Java_android_filterfw_core_NativeBuffer_deallocate(JNIEnv* env,
59dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                                                            jobject thiz,
60dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                                                            jboolean owns_data) {
61dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project  if (ToCppBool(owns_data)) {
62dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    char* data = GetJBufferData(env, thiz, NULL);
63dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    delete[] data;
64dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project  }
65dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project  return JNI_TRUE;
66dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
67dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
68dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectjboolean Java_android_filterfw_core_NativeBuffer_nativeCopyTo(JNIEnv* env,
69dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                                                              jobject thiz,
70dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                                                              jobject new_buffer) {
71dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project  // Get source buffer
72dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project  int size;
73dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project  char* source_data = GetJBufferData(env, thiz, &size);
74dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
75dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project  // Make copy
76dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project  char* target_data = new char[size];
77dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project  memcpy(target_data, source_data, size);
78dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
79dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project  // Attach it to new buffer
80dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project  AttachDataToJBuffer(env, new_buffer, target_data, size);
81dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
82dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project  return JNI_TRUE;
83dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
84dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
85dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project