参考
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]; }