您的位置:首页 > 移动开发 > Android开发

在android平台使用Eigen

2016-03-24 22:18 423 查看
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 <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));
}

}


到此结束,就可以直接运行了!源码下载地址随后给出,注意评论

菜鸟一个,欢迎大神指导!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: