#include <jni.h>
#include <android/log.h>
#include <android/bitmap.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <RenderScript.h>
#include "ScriptC_mono.h"
#define LOG_TAG "HelloComputeNDK"
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)
using namespace android::RSC;
extern "C" JNIEXPORT void JNICALL
Java_com_example_android_rs_hellocomputendk_HelloComputeNDK_nativeMono(JNIEnv * env,
jclass,
jstring pathObj,
jint X,
jint Y,
jobject jbitmapIn,
jobject jbitmapOut
)
{
void* inputPtr = nullptr;
void* outputPtr = nullptr;
AndroidBitmap_lockPixels(env, jbitmapIn, &inputPtr);
AndroidBitmap_lockPixels(env, jbitmapOut, &outputPtr);
const char * path = env->GetStringUTFChars(pathObj, nullptr);
sp<RS> rs = new RS();
rs->init(path);
env->ReleaseStringUTFChars(pathObj, path);
sp<const Element> e = Element::RGBA_8888(rs);
sp<const Type> t = Type::create(rs, e, X, Y, 0);
sp<Allocation> inputAlloc = Allocation::createTyped(rs, t, RS_ALLOCATION_MIPMAP_NONE,
RS_ALLOCATION_USAGE_SHARED | RS_ALLOCATION_USAGE_SCRIPT,
inputPtr);
sp<Allocation> outputAlloc = Allocation::createTyped(rs, t, RS_ALLOCATION_MIPMAP_NONE,
RS_ALLOCATION_USAGE_SHARED | RS_ALLOCATION_USAGE_SCRIPT,
outputPtr);
inputAlloc->copy2DRangeFrom(0, 0, X, Y, inputPtr);
ScriptC_mono* sc = new ScriptC_mono(rs);
sc->forEach_root(inputAlloc, outputAlloc);
outputAlloc->copy2DRangeTo(0, 0, X, Y, outputPtr);
AndroidBitmap_unlockPixels(env, jbitmapIn);
AndroidBitmap_unlockPixels(env, jbitmapOut);
}