一个使用Eigen库和jni的简单ndk项目

所以今天在这里的人们的帮助下,我整理了一个使用ndk的简单Android应用程序。 我将特征库直接导入到我在源代码树中创建的jni文件夹中,然后使用cygwin我能够编译项目。 下面是源代码,所以其他人试图学习jni基础知识,从c ++到java传递数据,然后返回一些代码。 应用程序只需要在edittext字段中输入6个数字,当用户单击该按钮时,两个浮点数组将传递给本机方法并加载到两个特征浮点向量中,然后将它们相加。 两个向量的乘积传递回java,然后显示在textview中。

下面是android的特征库的链接:

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

您只需要在文件树中向下一层的实际特征文件夹。 只需将一层的特征文件夹复制并粘贴到特征源中,然后放入您创建的jni文件夹中,以便在您的android项目中保存您的c ++代码。

inheritance人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  #include  #include  #include  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; } } 

现在inheritanceAndroid.mk文件:

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

你还需要设置一个Application.mk,这样你就可以使用stl来使用eigen:

 APP_STL := stlport_static 

最后但并非最不重要的是布局文件:

            

我实际上使用cygwin来使用ndk-build命令,但你现在可以使用旧的windows命令行来做同样的事情。 继续使用它作为示例来学习如何使用ndk将一些数据从java传递到c ++。 在这件事上肯定缺乏真正好的文件。 此外,如果您希望使用快速原生数学库,请在此链接中查看特征:

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

我希望这些东西可以帮助我学习如何将数据从java传递到本机端并返回:)

Solutions Collecting From Web of "一个使用Eigen库和jni的简单ndk项目"