2011-12-17 17 views
21

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 :)

+1

yardımcı oldu! Teşekkürler – user8709

+0

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. –

+1

Cevap olarak bir şey gönderin ve kabul edin! ;) – n00b

cevap

İlgili konular