在android平台使用Eigen

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));
    }

}

到此结束,就可以直接运行了!源码下载地址随后给出,注意评论
菜鸟一个,欢迎大神指导!

你可能感兴趣的:(Android,android,ndk,eigen,矩阵,c++)