blob: 791ab3c8bd3c179494cb3f0f28b7b5dad4ff7029 [file] [log] [blame]
/*
* Copyright (C) 2011 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.filterfw.core;
import android.filterfw.core.Frame;
import android.filterfw.core.Program;
/**
* @hide
*/
public class NativeProgram extends Program {
private int nativeProgramId;
private boolean mHasInitFunction = false;
private boolean mHasTeardownFunction = false;
private boolean mHasSetValueFunction = false;
private boolean mHasGetValueFunction = false;
private boolean mHasResetFunction = false;
private boolean mTornDown = false;
public NativeProgram(String nativeLibName, String nativeFunctionPrefix) {
// Allocate the native instance
allocate();
// Open the native library
String fullLibName = "lib" + nativeLibName + ".so";
if (!openNativeLibrary(fullLibName)) {
throw new RuntimeException("Could not find native library named '" + fullLibName + "' " +
"required for native program!");
}
// Bind the native functions
String processFuncName = nativeFunctionPrefix + "_process";
if (!bindProcessFunction(processFuncName)) {
throw new RuntimeException("Could not find native program function name " +
processFuncName + " in library " + fullLibName + "! " +
"This function is required!");
}
String initFuncName = nativeFunctionPrefix + "_init";
mHasInitFunction = bindInitFunction(initFuncName);
String teardownFuncName = nativeFunctionPrefix + "_teardown";
mHasTeardownFunction = bindTeardownFunction(teardownFuncName);
String setValueFuncName = nativeFunctionPrefix + "_setvalue";
mHasSetValueFunction = bindSetValueFunction(setValueFuncName);
String getValueFuncName = nativeFunctionPrefix + "_getvalue";
mHasGetValueFunction = bindGetValueFunction(getValueFuncName);
String resetFuncName = nativeFunctionPrefix + "_reset";
mHasResetFunction = bindResetFunction(resetFuncName);
// Initialize the native code
if (mHasInitFunction && !callNativeInit()) {
throw new RuntimeException("Could not initialize NativeProgram!");
}
}
public void tearDown() {
if (mTornDown) return;
if (mHasTeardownFunction && !callNativeTeardown()) {
throw new RuntimeException("Could not tear down NativeProgram!");
}
deallocate();
mTornDown = true;
}
@Override
public void reset() {
if (mHasResetFunction && !callNativeReset()) {
throw new RuntimeException("Could not reset NativeProgram!");
}
}
@Override
protected void finalize() throws Throwable {
tearDown();
}
@Override
public void process(Frame[] inputs, Frame output) {
if (mTornDown) {
throw new RuntimeException("NativeProgram already torn down!");
}
NativeFrame[] nativeInputs = new NativeFrame[inputs.length];
for (int i = 0; i < inputs.length; ++i) {
if (inputs[i] == null || inputs[i] instanceof NativeFrame) {
nativeInputs[i] = (NativeFrame)inputs[i];
} else {
throw new RuntimeException("NativeProgram got non-native frame as input "+ i +"!");
}
}
// Get the native output frame
NativeFrame nativeOutput = null;
if (output == null || output instanceof NativeFrame) {
nativeOutput = (NativeFrame)output;
} else {
throw new RuntimeException("NativeProgram got non-native output frame!");
}
// Process!
if (!callNativeProcess(nativeInputs, nativeOutput)) {
throw new RuntimeException("Calling native process() caused error!");
}
}
@Override
public void setHostValue(String variableName, Object value) {
if (mTornDown) {
throw new RuntimeException("NativeProgram already torn down!");
}
if (!mHasSetValueFunction) {
throw new RuntimeException("Attempting to set native variable, but native code does not " +
"define native setvalue function!");
}
if (!callNativeSetValue(variableName, value.toString())) {
throw new RuntimeException("Error setting native value for variable '" + variableName + "'!");
}
}
@Override
public Object getHostValue(String variableName) {
if (mTornDown) {
throw new RuntimeException("NativeProgram already torn down!");
}
if (!mHasGetValueFunction) {
throw new RuntimeException("Attempting to get native variable, but native code does not " +
"define native getvalue function!");
}
return callNativeGetValue(variableName);
}
static {
System.loadLibrary("filterfw");
}
private native boolean allocate();
private native boolean deallocate();
private native boolean nativeInit();
private native boolean openNativeLibrary(String libName);
private native boolean bindInitFunction(String funcName);
private native boolean bindSetValueFunction(String funcName);
private native boolean bindGetValueFunction(String funcName);
private native boolean bindProcessFunction(String funcName);
private native boolean bindResetFunction(String funcName);
private native boolean bindTeardownFunction(String funcName);
private native boolean callNativeInit();
private native boolean callNativeSetValue(String key, String value);
private native String callNativeGetValue(String key);
private native boolean callNativeProcess(NativeFrame[] inputs, NativeFrame output);
private native boolean callNativeReset();
private native boolean callNativeTeardown();
}