Commit 83d639f0 authored by A. Borzov's avatar A. Borzov
Browse files

пример как будут работать операции если vm написана на котлине, а операции на...

пример как будут работать операции если vm написана на котлине, а операции на c++. все массивы выделяются в c++, в kotlin возвращаются только указатели, которые потом снова передают в c++ для операций. Таким образом ничего не нужно оборачивать/разворачивать, так как передаются только примитивные типы.
parent e4fd0d13
#include <jni.h>
#include <string>
#include <android/log.h>
#define LOG_TAG "native"
#define printf(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
extern "C" JNIEXPORT jstring JNICALL
Java_ru_nsu_fit_borzov_kotlin_1cpp_MainActivity_stringFromJNI(
JNIEnv* env,
JNIEnv *env,
jobject /* this */) {
std::string hello = "Hello from C++";
return env->NewStringUTF(hello.c_str());
}extern "C"
JNIEXPORT jlong JNICALL
Java_ru_nsu_fit_borzov_kotlin_1cpp_edge_machine_DoubleArray_createArray(JNIEnv *env, jobject thiz,
jint size) {
return reinterpret_cast<jlong>(new double[size]);
}
extern "C"
JNIEXPORT void JNICALL
Java_ru_nsu_fit_borzov_kotlin_1cpp_edge_machine_DoubleArray_summ(JNIEnv *env, jobject thiz,
jlong aPtr,
jlong bPtr, jint size) {
auto *a = reinterpret_cast<double *>(aPtr);
auto *b = reinterpret_cast<double *>(bPtr);
for (int i = 0; i < size; i++) {
a[i] = a[i] + b[i];
}
}
extern "C"
JNIEXPORT jlong JNICALL
Java_ru_nsu_fit_borzov_kotlin_1cpp_edge_machine_DoubleArray_createAndfillArray(JNIEnv *env,
jobject thiz,
jdoubleArray array,
jint size) {
auto *ptr = new double[size];
env->GetDoubleArrayRegion(array, 0, size, ptr);
return reinterpret_cast<jlong>(ptr);
}extern "C"
JNIEXPORT void JNICALL
Java_ru_nsu_fit_borzov_kotlin_1cpp_edge_machine_DoubleArray_printArray(JNIEnv *env, jobject thiz,
jlong ptr, jint size) {
auto* arr = reinterpret_cast<double *>(ptr);
for (int i = 0; i < size; i++) {
printf("%lf", arr[i]);
}
printf("\n");
}
\ No newline at end of file
package ru.nsu.fit.borzov.kotlin_cpp
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.TextView
import ru.nsu.fit.borzov.kotlin_cpp.edge.machine.TaskExecutor
import ru.nsu.fit.borzov.kotlin_cpp.edge.user.while1
import androidx.appcompat.app.AppCompatActivity
import ru.nsu.fit.borzov.kotlin_cpp.edge.machine.DoubleArray
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
/*
пример как будут работать операции если vm написана на котлине, а операции на c++.
все массивы выделяются в c++, в kotlin возвращаются только указатели,
которые потом снова передают в c++ для операций.
Таким образом ничего не нужно оборачивать/разворачивать,
так как передаются только примитивные типы.
*/
// Example of a call to a native method
//findViewById<TextView>(R.id.sample_text).text = stringFromJNI()
val t = while1();
val ex = TaskExecutor(t);
ex.run();
//val t = while1();
//val ex = TaskExecutor(t);
//ex.run();
val a = DoubleArray(doubleArrayOf(1.0, 2.0, 3.0, 4.0, 5.0))
val b = DoubleArray(doubleArrayOf(10.0, 20.0, 30.0, 40.0, 50.0))
a.print();
a.sum(b);
b.print();
a.print();
}
/**
......
......@@ -9,4 +9,5 @@ class LInt(id: Int) : LCInt(0,id)
open class LCBool(var value: Boolean, id: Int) : LVariable(id)
open class LCDouble(var value: Double, id: Int) : LVariable(id)
open class LCInt(var value: Int, id: Int) : LVariable(id)
\ No newline at end of file
open class LCInt(var value: Int, id: Int) : LVariable(id)
open class LCDoubleArray(var values: Array<Double>, id: Int) : LVariable(id)
\ No newline at end of file
package ru.nsu.fit.borzov.kotlin_cpp.edge.machine
val NULL: Long = 0;
class DoubleArray(values: kotlin.DoubleArray, val size: Int) {
val address: Long
constructor(size: Int): this(doubleArrayOf(),size)
constructor(values: kotlin.DoubleArray): this(values, values.size)
init {
if(values.isEmpty()) {
address = createArray(values.size)
} else {
address = createAndfillArray(values,values.size)
}
}
/*
private lateinit var address: Long createArray(size)
constructor(values: Array<Double>) : this(values.size.toLong()) {
}*/
fun sum(b: DoubleArray) {
summ(this.address, b.address, size)
}
private external fun createArray(size: Int): Long
private external fun summ(a: Long, b: Long, size: Int)
//private external fun fillArray(array: Array<Double>, size: Long)
private external fun createAndfillArray(array: kotlin.DoubleArray, size: Int): Long
private external fun printArray(ptr: Long, size: Int)
fun print() {
printArray(address, size);
}
}
\ No newline at end of file
package ru.nsu.fit.borzov.kotlin_cpp.edge.machine;
public class JavaStatic {
//public static native void fillArray(double[] array, int size);
//public static native long createAndfillArray(double[] array, int size);
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment