2011-12-17 6 views
21

今日、ここにいる人々の助けを借りて、ndkを使用する簡単なアンドロイドアプリをまとめました。私はソースツリーで作成したjniフォルダに固有ライブラリをインポートしてから、cygwinを使ってプロジェクトをコンパイルできました。ソースを掘り下げて、jniの基礎を学ぶことを試みている他の人が、C++からjavaおよびbackにデータを渡したり渡したりするコードをいくつか持っています。このアプリはedittextフィールドで6つの数字を取ります。ユーザーがボタンをクリックすると、2つの浮動小数点配列がネイティブメソッドに渡され、2つの固有フロートベクトルにロードされ、そこで追加されます。 2つのベクトルの積はjavaに戻され、テキストビューで表示されます。アンドロイドのための固有のライブラリへEigenライブラリとjniを使ったシンプルなndkプロジェクト

HERESにリンク:

https://bitbucket.org/erublee/eigen-android 

あなただけのファイルツリーにダウン1層である実際の固有のフォルダを必要としています。ただ1つの層を固有のソースにコピーして貼り付け、アンドロイドプロジェクトでC++コードを保持するために作成するjniフォルダの中に置きます。

相続人の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"); 
} 
} 

とC++コード:今すぐ

#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ファイル:

LOCAL_PATH := $(call my-dir) 
include $(CLEAR_VARS) 
LOCAL_MODULE := test 
LOCAL_SRC_FILES := test.cpp 
include $(BUILD_SHARED_LIBRARY) 

Youllはまた、アプリケーションを設定する必要があります.mkので、stlを使ってeigenを使うことができます:

私は実際にNDK-buildコマンドを使用するためにCygwinを使用していますが、今同じことを行うには古き良きWindowsのコマンドラインを使用することができます

<?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 

最後になりましたが、レイアウトファイルです。このサンプルを使って、ndkを使ってjavaからC++へのデータを渡す方法を学んでください。確かに、この問題についての本当に良い文書の深刻な欠如です。あなたは、このリンクに固有のチェックアウト、高速ネイティブ数学ライブラリを使用するために探している場合も:

http://eigen.tuxfamily.org/index.php?title=Main_Page 

それがネイティブ側にJavaからデータを渡す方法を学ぶために私を助けたように私はこのようなものはいくつかのいずれかを行うことができます願っていますし、バック:)

+1

これは役に立ちました!ありがとう – user8709

+0

心配しない:) JNIを使​​用して必要な方法で前後にデータを取得する方法を理解するのに2日かかったので、他の人がどのように動作しているかを確認するのに役立ちます。 –

+1

何かを回答として受け入れて受け入れてください! ;) – n00b

答えて

関連する問題