Eigen是功能强大的矩阵计算的C++的开源的库,本文介绍怎样移植到android平台使用!
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
#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;iif(i!=len-1){
sb.append("、");
}
}
sb.append("\n");
sb.append("\n");
sb.append("第二组矩阵为:");
len=f2.length;
for(int i=0;iif(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;iif(i!=len-1){
sb.append("、");
}
}
}
textView1.setText(new String(sb));
}
}
到此结束,就可以直接运行了!源码下载地址随后给出,注意评论
菜鸟一个,欢迎大神指导!