1 /* 2 * Copyright (C) 2011 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #include <string> 18 #include <vector> 19 20 #include "jni/jni_native_program.h" 21 #include "jni/jni_util.h" 22 23 #include "native/base/logging.h" 24 #include "native/core/native_frame.h" 25 #include "native/core/native_program.h" 26 27 using android::filterfw::NativeFrame; 28 using android::filterfw::NativeProgram; 29 30 jboolean Java_android_filterfw_core_NativeProgram_allocate(JNIEnv* env, jobject thiz) { 31 return ToJBool(WrapObjectInJava(new NativeProgram(), env, thiz, true)); 32 } 33 34 jboolean Java_android_filterfw_core_NativeProgram_deallocate(JNIEnv* env, jobject thiz) { 35 return ToJBool(DeleteNativeObject<NativeProgram>(env, thiz)); 36 } 37 38 jboolean Java_android_filterfw_core_NativeProgram_nativeInit(JNIEnv* env, jobject thiz) { 39 NativeProgram* program = ConvertFromJava<NativeProgram>(env, thiz); 40 return ToJBool(program && program->CallInit()); 41 } 42 43 jboolean Java_android_filterfw_core_NativeProgram_openNativeLibrary(JNIEnv* env, 44 jobject thiz, 45 jstring lib_name) { 46 NativeProgram* program = ConvertFromJava<NativeProgram>(env, thiz); 47 return ToJBool(program && lib_name && program->OpenLibrary(ToCppString(env, lib_name))); 48 } 49 50 jboolean Java_android_filterfw_core_NativeProgram_bindInitFunction(JNIEnv* env, 51 jobject thiz, 52 jstring func_name) { 53 NativeProgram* program = ConvertFromJava<NativeProgram>(env, thiz); 54 return ToJBool(program && func_name && program->BindInitFunction(ToCppString(env, func_name))); 55 } 56 57 jboolean Java_android_filterfw_core_NativeProgram_bindSetValueFunction(JNIEnv* env, 58 jobject thiz, 59 jstring func_name) { 60 NativeProgram* program = ConvertFromJava<NativeProgram>(env, thiz); 61 return ToJBool(program && 62 func_name && 63 program->BindSetValueFunction(ToCppString(env, func_name))); 64 } 65 66 jboolean Java_android_filterfw_core_NativeProgram_bindGetValueFunction(JNIEnv* env, 67 jobject thiz, 68 jstring func_name) { 69 NativeProgram* program = ConvertFromJava<NativeProgram>(env, thiz); 70 return ToJBool(program && 71 func_name && 72 program->BindGetValueFunction(ToCppString(env, func_name))); 73 } 74 75 jboolean Java_android_filterfw_core_NativeProgram_bindProcessFunction(JNIEnv* env, 76 jobject thiz, 77 jstring func_name) { 78 NativeProgram* program = ConvertFromJava<NativeProgram>(env, thiz); 79 return ToJBool(program && func_name && program->BindProcessFunction(ToCppString(env, func_name))); 80 } 81 82 jboolean Java_android_filterfw_core_NativeProgram_bindResetFunction(JNIEnv* env, 83 jobject thiz, 84 jstring func_name) { 85 NativeProgram* program = ConvertFromJava<NativeProgram>(env, thiz); 86 return ToJBool(program && 87 func_name && 88 program->BindResetFunction(ToCppString(env, func_name))); 89 } 90 91 jboolean Java_android_filterfw_core_NativeProgram_bindTeardownFunction(JNIEnv* env, 92 jobject thiz, 93 jstring func_name) { 94 NativeProgram* program = ConvertFromJava<NativeProgram>(env, thiz); 95 return ToJBool(program && 96 func_name && 97 program->BindTeardownFunction(ToCppString(env, func_name))); 98 } 99 100 jboolean Java_android_filterfw_core_NativeProgram_callNativeInit(JNIEnv* env, jobject thiz) { 101 NativeProgram* program = ConvertFromJava<NativeProgram>(env, thiz); 102 return ToJBool(program && program->CallInit()); 103 } 104 105 jboolean Java_android_filterfw_core_NativeProgram_callNativeSetValue(JNIEnv* env, 106 jobject thiz, 107 jstring key, 108 jstring value) { 109 if (!value) { 110 LOGE("Native Program: Attempting to set null value for key %s!", 111 ToCppString(env, key).c_str()); 112 } 113 NativeProgram* program = ConvertFromJava<NativeProgram>(env, thiz); 114 const std::string c_value = ToCppString(env, value); 115 const std::string c_key = ToCppString(env, key); 116 return ToJBool(program && program->CallSetValue(c_key, c_value)); 117 } 118 119 jstring Java_android_filterfw_core_NativeProgram_callNativeGetValue(JNIEnv* env, 120 jobject thiz, 121 jstring key) { 122 NativeProgram* program = ConvertFromJava<NativeProgram>(env, thiz); 123 const std::string c_key = ToCppString(env, key); 124 if (program) { 125 return ToJString(env, program->CallGetValue(c_key)); 126 } 127 return JNI_FALSE; 128 } 129 130 jboolean Java_android_filterfw_core_NativeProgram_callNativeProcess(JNIEnv* env, 131 jobject thiz, 132 jobjectArray inputs, 133 jobject output) { 134 NativeProgram* program = ConvertFromJava<NativeProgram>(env, thiz); 135 136 // Sanity checks 137 if (!program || !inputs) { 138 return JNI_FALSE; 139 } 140 141 // Get the input buffers 142 const int input_count = env->GetArrayLength(inputs); 143 std::vector<const char*> input_buffers(input_count, NULL); 144 std::vector<int> input_sizes(input_count, 0); 145 for (int i = 0 ; i < input_count; ++i) { 146 const char* input_data = NULL; 147 int input_size = 0; 148 jobject input = env->GetObjectArrayElement(inputs, i); 149 if (input) { 150 NativeFrame* native_frame = ConvertFromJava<NativeFrame>(env, input); 151 if (!native_frame) { 152 LOGE("NativeProgram: Could not grab NativeFrame input %d!", i); 153 return JNI_FALSE; 154 } 155 input_data = reinterpret_cast<const char*>(native_frame->Data()); 156 input_size = native_frame->Size(); 157 } 158 input_buffers[i] = input_data; 159 input_sizes[i] = input_size; 160 } 161 162 // Get the output buffer 163 char* output_data = NULL; 164 int output_size = 0; 165 if (output) { 166 NativeFrame* output_frame = ConvertFromJava<NativeFrame>(env, output); 167 if (!output_frame) { 168 LOGE("NativeProgram: Could not grab NativeFrame output!"); 169 return JNI_FALSE; 170 } 171 output_data = reinterpret_cast<char*>(output_frame->MutableData()); 172 output_size = output_frame->Size(); 173 } 174 175 // Process the frames! 176 return ToJBool(program->CallProcess(input_buffers, input_sizes, output_data, output_size)); 177 } 178 179 jboolean Java_android_filterfw_core_NativeProgram_callNativeReset(JNIEnv* env, jobject thiz) { 180 NativeProgram* program = ConvertFromJava<NativeProgram>(env, thiz); 181 return ToJBool(program && program->CallReset()); 182 } 183 184 jboolean Java_android_filterfw_core_NativeProgram_callNativeTeardown(JNIEnv* env, jobject thiz) { 185 NativeProgram* program = ConvertFromJava<NativeProgram>(env, thiz); 186 return ToJBool(program && program->CallTeardown()); 187 } 188