所以今天在这里的人们的帮助下,我把一个简单的android应用程序放在一起,它使用了ndk。我将eigen库导入到我在源代码树中创建的jni文件夹中,然后使用cygwin我可以编译该项目。下面是源代码,所以其他人试图学习jni基础知识将数据从C++传递到java,然后返回一些代码。应用程序只需要在edittext字段中输入6个数字,并且当用户单击按钮时,两个浮点数组被传递到本地方法并加载到两个特征浮点向量中,然后将它们加在一起。这两个向量的产物被传回给java,然后显示在一个textview中。一个简单的ndk项目使用特征库和jni
继承人的本征库的链接的android:
https://bitbucket.org/erublee/eigen-android
你只需要实际本征的文件夹是下一层的文件树。只需复制一个图层的特征文件夹并将其粘贴到特征源中,并将其放置在您创建的jni文件夹中,以便将C++代码保存在您的android项目中。
继承人的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;
}
}
现在继承人的Android.mk文件:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := test
LOCAL_SRC_FILES := test.cpp
include $(BUILD_SHARED_LIBRARY)
刹那间还需要建立一个应用程序.mk所以你可以使用stl来使用特征:
APP_STL := stlport_static
最后但并非最不重要的是布局文件:
<?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>
我实际使用cygwin的使用NDK-build命令,但你现在可以使用好老的Windows命令行做同样的事情。继续,以此作为示例,学习如何使用ndk将一些数据从java传递到C++。在这个问题上确实存在严重缺乏真正优秀的文件。此外,如果你希望使用一个快速的原生数学库在此链接看看征:
http://eigen.tuxfamily.org/index.php?title=Main_Page
我希望这东西可以帮助一些一出像它帮助我学习如何从Java数据传递到本机端和回来:)
这很有帮助!谢谢 – user8709 2012-01-31 04:57:37