diff --git a/examples/android/android-simple/app/src/main/cpp/KomputeJniNative.cpp b/examples/android/android-simple/app/src/main/cpp/KomputeJniNative.cpp index b97b2f05e..9ca5c702f 100644 --- a/examples/android/android-simple/app/src/main/cpp/KomputeJniNative.cpp +++ b/examples/android/android-simple/app/src/main/cpp/KomputeJniNative.cpp @@ -40,6 +40,22 @@ static const char* kTAG = "KomputeJni"; #define LOGE(...) \ ((void)__android_log_print(ANDROID_LOG_ERROR, kTAG, __VA_ARGS__)) +static std::vector jfloatArrayToVector(JNIEnv *env, const jfloatArray & fromArray) { + float *inCArray = env->GetFloatArrayElements(fromArray, NULL); + if (NULL == inCArray) return std::vector(); + int32_t length = env->GetArrayLength(fromArray); + + std::vector outVector(inCArray, inCArray + length); + return outVector; +} + +static jfloatArray vectorToJFloatArray(JNIEnv *env, const std::vector & fromVector) { + jfloatArray ret = env->NewFloatArray(fromVector.size()); + if (NULL == ret) return NULL; + env->SetFloatArrayRegion(ret, 0, fromVector.size(), fromVector.data()); + return ret; +} + extern "C" { JNIEXPORT jboolean JNICALL @@ -60,16 +76,25 @@ Java_com_ethicalml_kompute_KomputeJni_initVulkan(JNIEnv *env, jobject thiz) { } -JNIEXPORT jstring JNICALL -Java_com_ethicalml_kompute_KomputeJni_stringFromJNI(JNIEnv *env, jobject thiz) { +JNIEXPORT jfloatArray JNICALL +Java_com_ethicalml_kompute_KomputeJni_kompute( + JNIEnv *env, + jobject thiz, + jfloatArray xiJFloatArr, + jfloatArray xjJFloatArr, + jfloatArray yJFloatArr) { LOGI("Creating manager"); + std::vector xiVector = jfloatArrayToVector(env, xiJFloatArr); + std::vector xjVector = jfloatArrayToVector(env, xjJFloatArr); + std::vector yVector = jfloatArrayToVector(env, yJFloatArr); + kp::Manager mgr; - auto tensorA = mgr.buildTensor({0,1,2}); - auto tensorB = mgr.buildTensor({0,1,2}); - auto tensorC = mgr.buildTensor({1,2,3}); + auto tensorA = mgr.buildTensor(xiVector); + auto tensorB = mgr.buildTensor(xjVector); + auto tensorC = mgr.buildTensor(yVector); LOGI("Result before:"); for(const float & i : tensorC->data()) { @@ -84,6 +109,6 @@ Java_com_ethicalml_kompute_KomputeJni_stringFromJNI(JNIEnv *env, jobject thiz) { LOGI("%f ", i); } - return env->NewStringUTF("Result is: "); + return vectorToJFloatArray(env, tensorC->data()); } } diff --git a/examples/android/android-simple/app/src/main/java/com/ethicalml/kompute/KomputeJni.kt b/examples/android/android-simple/app/src/main/java/com/ethicalml/kompute/KomputeJni.kt index e306cf5b2..d6e44e482 100755 --- a/examples/android/android-simple/app/src/main/java/com/ethicalml/kompute/KomputeJni.kt +++ b/examples/android/android-simple/app/src/main/java/com/ethicalml/kompute/KomputeJni.kt @@ -18,6 +18,10 @@ package com.ethicalml.kompute import android.os.Bundle import android.util.Log import androidx.appcompat.app.AppCompatActivity +import android.widget.Toast +import android.view.View +import android.widget.EditText +import android.widget.TextView import com.ethicalml.kompute.databinding.ActivityKomputeJniBinding class KomputeJni : AppCompatActivity() { @@ -34,14 +38,42 @@ class KomputeJni : AppCompatActivity() { binding.komputeGifView.getSettings().setLoadWithOverviewMode(true) val successVulkanInit = initVulkan() + if (successVulkanInit) { + Toast.makeText(applicationContext, "Vulkan Loaded SUCCESS", Toast.LENGTH_SHORT).show() + } else { + binding.KomputeButton.isEnabled = false + Toast.makeText(applicationContext, "Vulkan Load FAILED", Toast.LENGTH_SHORT).show() + } Log.i("KomputeJni", "Vulkan Result: " + successVulkanInit) - binding.komputeJniTextview.text = stringFromJNI() + binding.komputeJniTextview.text = "N/A" + } + + fun KomputeButtonOnClick(v: View) { + +// val binding = ActivityKomputeJniBinding.inflate(layoutInflater) +// setContentView(binding.root) + + val xiEditText = findViewById(R.id.XIEditText) + val xjEditText = findViewById(R.id.XJEditText) + val yEditText = findViewById(R.id.YEditText) + val komputeJniTextview = findViewById(R.id.kompute_jni_textview) + + val xi = xiEditText.text.removeSurrounding("[", "]").split(",").map { it.toFloat() }.toFloatArray() + val xj = xjEditText.text.removeSurrounding("[", "]").split(",").map { it.toFloat() }.toFloatArray() + val y = yEditText.text.removeSurrounding("[", "]").split(",").map { it.toFloat() }.toFloatArray() + + val out = kompute(xi, xj, y) + + Log.i("KomputeJni", "RESULT:") + Log.i("KomputeJni", out.contentToString()) + + komputeJniTextview.text = out.contentToString() } external fun initVulkan(): Boolean - external fun stringFromJNI(): String + external fun kompute(xi: FloatArray, xj: FloatArray, y: FloatArray): FloatArray companion object { init { diff --git a/examples/android/android-simple/app/src/main/res/layout/activity_kompute_jni.xml b/examples/android/android-simple/app/src/main/res/layout/activity_kompute_jni.xml index 26294546e..0cbb0cb97 100644 --- a/examples/android/android-simple/app/src/main/res/layout/activity_kompute_jni.xml +++ b/examples/android/android-simple/app/src/main/res/layout/activity_kompute_jni.xml @@ -10,10 +10,11 @@ + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintTop_toTopOf="parent" + tools:layout_editor_absoluteX="1dp"> + android:text="[ 1, 2, 3 ]" /> + + + + + + + + + + + + + + + + + + + + + + +