clapack在android上移植

参考

https://www.cnblogs.com/hrlnw/p/4128217.html

如何在android上进行android库编译

https://blog.csdn.net/h3c4lenovo/article/details/10364679

1 设置ndk环境
export ANDROID_NDK_HOME=/DATA/Android/Ndk/android-ndk-r13b
export PATH=$PATH:$ANDROID_NDK_HOME
#ANDROID_NDK_HOME=/DATA/share/software/android-ndk-r16

2 make 与gcc确保无问题
make -v
gcc -v

3 写好jni文件

4 编译ndk-build

5 android工程调用


#如果同时编译32和64未版本,或会导致32位的库打包到64位中,需要单独编译,
#./obj/local/arm64-v8a/libtestlapack.so: error adding symbols: File in wrong format

导致32位的库打包到64位中,
[arm64-v8a] Prebuilt : libtestlapack.so <= jni/lapack/lib/armeabi-v7a/
[arm64-v8a] Install : libtestlapack.so => libs/arm64-v8a/libtestlapack.so
[arm64-v8a] Compile++ : mtcnn_facedetect <= similaritytrans.cpp

#include <stdio.h>
#include <string.h>
#include <jni.h>
#include <complex>
#include <sstream>
#include <string>
#include <android/log.h>
#define TAG "log"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,TAG ,__VA_ARGS__)


// #ifndef JNIEXPORT
// #define JNIEXPORT
// #endif

// #ifndef JNICALL
// #define JNICALL
// #endif

static long dgesvd(char *jobu, char *jobvt, long *m, long *n, 
    double *a, long *lda, double *s, double *u, long *
    ldu, double *vt, long *ldvt, double *work, long *lwork)
{
    // int dgesvd_(char *jobu, char *jobvt, integer *m, integer *n, 
    // doublereal *a, integer *lda, doublereal *s, doublereal *u, integer *
    // ldu, doublereal *vt, integer *ldvt, doublereal *work, integer *lwork, 
    // integer *info)

    extern int dgesvd_(char *jobu, char *jobvt, long *m, long *n, 
    double *a, long *lda, double *s, double *u, long *
    ldu, double *vt, long *ldvt, double *work, long *lwork, 
    long *info);

    long info;
    dgesvd_("A", "A", m, n, a, lda, s, u, ldu, vt, ldvt, work, lwork, &info);
    return info;
}


#define mymax(a,b) (a) > (b) ? (a) : (b)
#define mymin(a,b) (a) < (b) ? (a) : (b)


void transposeMatrix(double *A, int row, int col)
{
    for(int i =0; i < row; ++i)
    {
        for (int j = i; j < col; ++j)
        {
            double temp = A[i * col + j];
            A[i * col + j] = A[j * col + i];
            A[j *col + i] = temp;
        }
    }
}

int GetLapackSVD(double *a, double *u, double *s, double *vt)
{
   //double a[2*2] = {4 , 4 , -3 ,  3};
   //这个函数,这里要特别注意储存方式(column major)!!
   transposeMatrix(a,2,2);
   long m,n;
   long lda,ldu,ldvt,lwork;
   m = 2;
   n = 2;
   lda = 2;
   ldu = 2;
   ldvt = 2;
   //https://blog.csdn.net/versuna/article/details/8246377
   lwork = 10;//mymax(3*mymin(m, n)+mymax(m, n), 5*mymin(m,n));
   LOGD("#lwork = %d", lwork);
   double work[1*lwork];
   char jobu = 'A';
   char jobvt = 'A';
   dgesvd(&jobu, &jobvt, &m, &n, a, &lda, s, u, &ldu, vt, &ldvt, work, &lwork);
   return 0;
}

int main()
{
    double a[4];
    double u[4];
    double s[2];
    double vt[4];
}

猜你喜欢

转载自www.cnblogs.com/adong7639/p/9316371.html