在android平台使用Eigen
2016-03-24 22:18
423 查看
Eigen是功能强大的矩阵计算的C++的开源的库,本文介绍怎样移植到android平台使用!
1、配置android NDK的开发环境
2、创建一个新的项目(eclipse的开发环境)
3、到Eigen官网下载数据,解压后把Eigen的文件夹下的文件直接复制到项目的jni文件夹下
4、创建Android.mk文件,代码如下
5、创建Application.mk,代码如下
6、创建test.cpp文件
7、创建一个java类,如下
注意类型和包名,一定要和test.cpp里面的一致
8、实现MainActivity
到此结束,就可以直接运行了!源码下载地址随后给出,注意评论
菜鸟一个,欢迎大神指导!
1、配置android NDK的开发环境
2、创建一个新的项目(eclipse的开发环境)
3、到Eigen官网下载数据,解压后把Eigen的文件夹下的文件直接复制到项目的jni文件夹下
4、创建Android.mk文件,代码如下
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_C_INCLUDES += $(LOCAL_PATH) LOCAL_LDLIBS += -llog -ldl #LOCAL_CPPFLAGS += -fexceptions LOCAL_MODULE := test LOCAL_SRC_FILES := test.cpp include $(BUILD_SHARED_LIBRARY)
5、创建Application.mk,代码如下
APP_ABI := all APP_STL := stlport_static APP_CPPFLAGS += -fexceptions
6、创建test.cpp文件
#include <iostream> #include <math.h> #include <jni.h> //#include <EigenUtil.h> #include <exception> #include <Eigen/Dense> #include "log.h" using namespace Eigen; extern "C" { JNIEXPORT jdoubleArray JNICALL Java_com_example_androideigen_EigenLib_adding (JNIEnv *env, jobject obj, jdoubleArray fltarray1, jdoubleArray fltarray2,jint row,jint col) { jdoubleArray result; jsize alen1 = env->GetArrayLength(fltarray1); //获取长度 jsize alen2 = env->GetArrayLength(fltarray2); //获取长度 //判断长度是否一致 if(alen1!=alen2) { return NULL; } //判读长度是否正确 if(alen1!=row*col) { return NULL; } result = env->NewDoubleArray(alen1); if (result == NULL) { return NULL; /* out of memory error thrown */ } jdouble* flt1 = env->GetDoubleArrayElements( fltarray1,0); jdouble* flt2 = env->GetDoubleArrayElements( fltarray2,0); //动态矩阵,运行时确定 MatrixXd Map<MatrixXd> dymMat1(flt1,row,col); Map<MatrixXd> dymMat2(flt2,row,col); MatrixXd xd=dymMat1+dymMat2; flt1=xd.data(); int len=(int)(row*col); env->SetDoubleArrayRegion(result, 0, len, flt1); env->ReleaseDoubleArrayElements(fltarray1, flt1, 0); env->ReleaseDoubleArrayElements(fltarray2, flt2, 0); return result; } }
7、创建一个java类,如下
package com.example.androideigen; public class EigenLib { static { System.loadLibrary("test"); } public static native double[] adding(double[] array1, double[] array2,int row,int col); }
注意类型和包名,一定要和test.cpp里面的一致
8、实现MainActivity
package com.example.androideigen; import android.app.Activity; import android.os.Bundle; import android.widget.TextView; public class MainActivity extends Activity { private TextView textView1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); super.setContentView(R.layout.activity_main); textView1=(TextView)findViewById(R.id.textView1); double[] f1={1,324,65,76,87,98,45,56}; double[] f2={23,45,6,7,34,56,76,87}; double[] f=EigenLib.adding(f1,f2,2,4); StringBuffer sb=new StringBuffer(); sb.append("第一组矩阵为:"); int len=f1.length; for(int i=0;i<len;i++){ sb.append(f1[i]); if(i!=len-1){ sb.append("、"); } } sb.append("\n"); sb.append("\n"); sb.append("第二组矩阵为:"); len=f2.length; for(int i=0;i<len;i++){ sb.append(f2[i]); if(i!=len-1){ sb.append("、"); } } sb.append("\n"); sb.append("\n"); sb.append("计算结果"); if(f==null){ sb.append("数据源出错!"); }else{ len=f.length; for(int i=0;i<len;i++){ sb.append(f[i]); if(i!=len-1){ sb.append("、"); } } } textView1.setText(new String(sb)); } }
到此结束,就可以直接运行了!源码下载地址随后给出,注意评论
菜鸟一个,欢迎大神指导!
相关文章推荐
- Android Ndk
- Android技术积累:开发规范
- android 中Activity 加载Fragment ;Fragment中加载ViewPager
- android 添加监听器失败
- 在Android Studio中查看Sqlite数据内容的方法
- [android] 在不同的activity之间传递数据
- Android中layout-sw600dp、layout-w600dp和layout-h600dp的区别
- Android消息机制中Handler切换线程的思考
- Android存储数据到sdcard
- Android AsynTask
- android listview改变字体的大小、颜色
- 第四周Android实习笔记
- LruCache,DiskLruCache实现分析
- Android 自动显示与隐藏布局的 ListView
- android 抽取BaseFragment
- AndroidStudio无法启动手机虚拟机
- android事件传递机制测试分析
- androidstudio使用
- android android.widget.Switch控件的介绍
- ubuntu14.04 配置 AOSP(android open source project)android系统源码编译环境