Bugün buradaki insanlardan bazı yardımlarla birlikte ndk kullanan basit bir android uygulaması oluşturdum. Eigen kütüphanesini doğrudan kaynak ağacında oluşturduğum jni klasörüne aktardım ve daha sonra cygwin'i kullanarak projeyi derleyebildim. Heres bu yüzden diğer insanların jni temellerini öğrenmeye çalıştığı için, C++ 'dan java ve arkasına veriyi geri ve ileriye götüren bazı kodlar var. Uygulama, edittext alanlarında 6 numarayı alır ve kullanıcı düğmeyi tıkladığında, iki float dizisi yerel yönteme geçirilir ve daha sonra birlikte eklendikleri iki özdeğer float vektörüne yüklenir. İki vektörün ürünü, java'ya geri gönderilir ve ardından bir metin görünümünde görüntülenir. İşteEigen kütüphanesini ve jni'yi kullanarak basit bir ndk projesi
android için eigen kütüphaneye bir bağlantı:
https://bitbucket.org/erublee/eigen-android
sadece dosya ağacındaki bir katman aşağı gerçek öz klasörü gerekir. Sadece bir katmanın öz kaynağını eigen kaynağına kopyalayıp yapıştırın ve android projenize C++ kodunuzu tutmak için oluşturduğunuz jni klasörünün içine yerleştirin.
İşte java:
package jnimath.act;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class JnimathActivity extends Activity {
/** Called when the activity is first created. */
public EditText x;
public EditText y;
public EditText z;
public EditText x2;
public EditText y2;
public EditText z2;
public float[] vecArray;
public TextView textView1;
public Button run;
float[] array3 = new float[3];
float[] array1 = new float[3];
float[] array2 = new float[3];
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
x = (EditText)findViewById(R.id.x);
y = (EditText)findViewById(R.id.y);
z = (EditText)findViewById(R.id.z);
x2 = (EditText)findViewById(R.id.x);
y2 = (EditText)findViewById(R.id.y);
z2 = (EditText)findViewById(R.id.z);
textView1 = (TextView)findViewById(R.id.textView1);
run = (Button)findViewById(R.id.run);
run.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
array1[0] = Float.parseFloat(x.getText().toString());
array1[1] = Float.parseFloat(y.getText().toString());
array1[2] = Float.parseFloat(z.getText().toString());
array2[0] = Float.parseFloat(x2.getText().toString());
array2[1] = Float.parseFloat(y2.getText().toString());
array2[2] = Float.parseFloat(z2.getText().toString());
array3 = test(array1, array2);
String text = array3[0]+" "+array3[1]+" "+array3[2];
textView1.setText(text);
}
});
}
public native float[] test(float[] array1, float[] array2);
static {
System.loadLibrary("test");
}
}
Ve C++ kodu: Şimdi
#include <iostream>
#include <Eigen/Dense>
#include <math.h>
#include <jni.h>
using namespace Eigen;
Vector3f vec;
Vector3f vec2;
Vector3f vecRtrn;
void vecLoad(float x, float y, float z, float x2, float y2, float z2){
vec(0) = x;
vec(1) = y;
vec(2) = z;
vec2(0) = x2;
vec2(1) = y2;
vec2(2) = z2;
}
void vecAdd(Vector3f vecA, Vector3f vecB){
vecRtrn = vecA + vecB;
}
extern "C"
{
JNIEXPORT jfloatArray JNICALL Java_jnimath_act_JnimathActivity_test
(JNIEnv *env, jobject obj, jfloatArray fltarray1, jfloatArray fltarray2)
{
jfloatArray result;
result = env->NewFloatArray(3);
if (result == NULL) {
return NULL; /* out of memory error thrown */
}
jfloat array1[3];
jfloat* flt1 = env->GetFloatArrayElements(fltarray1,0);
jfloat* flt2 = env->GetFloatArrayElements(fltarray2,0);
vecLoad(flt1[0], flt1[1], flt1[2], flt2[0], flt2[1], flt2[2]);
vecAdd(vec, vec2);
array1[0] = vecRtrn[0];
array1[1] = vecRtrn[1];
array1[2] = vecRtrn[2];
env->ReleaseFloatArrayElements(fltarray1, flt1, 0);
env->ReleaseFloatArrayElements(fltarray2, flt2, 0);
env->SetFloatArrayRegion(result, 0, 3, array1);
return result;
}
}
heres Android.mk dosyası:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := test
LOCAL_SRC_FILES := test.cpp
include $(BUILD_SHARED_LIBRARY)
Duyacaksınız Bir Uygulamayı kurmak gerekir .mk dolayısıyla, özünü kullanmak için stl'yi kullanabilirsiniz:
Aslında ndk-build komutunu kullanmak için cygwin kullanılan ama şimdi aynı şeyi yapmak için iyi eski pencereler komut satırını kullanabilirsiniz<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello" />
<EditText
android:id="@+id/x"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="z" >
<requestFocus />
</EditText>
<EditText
android:id="@+id/y"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="y" />
<EditText
android:id="@+id/z"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="z" />
<EditText
android:id="@+id/x2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="x2" />
<EditText
android:id="@+id/y2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="y2" />
<EditText
android:id="@+id/z2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="z2" />
<Button
android:id="@+id/run"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="run" />
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="matrix output" />
</LinearLayout>
:
APP_STL := stlport_static
Son olarak düzen dosyasıdır. Devam edin ve ndk'yi kullanarak java'dan C++ 'a bazı verileri nasıl geçireceğinizi öğrenmek için bunu bir örnek olarak kullanın. Konuyla ilgili gerçekten çok iyi belgelerin bulunmaması kesinlikle kesindir. Ayrıca senin hızlı yerli matematik kütüphanesi bu bağlantıda Eigen kontrol kullanmak isteyen varsa: o yerli tarafına java veri aktarma yöntemini öğrenmek için bana yardımcı gibi bu şeyleri umut
http://eigen.tuxfamily.org/index.php?title=Main_Page
bazı birini yardımcı olur ve geri :)
yardımcı oldu! Teşekkürler – user8709
Endişelenmeyin :) JNI kullanarak veriyi nasıl ve nasıl geri alabileceğimi anlamaya çalışmak iki gün sürdü, bu yüzden diğer insanların çalışmamı nasıl gördüğüne yardımcı olacağını düşündüm. –
Cevap olarak bir şey gönderin ve kabul edin! ;) – n00b