dlib 18 android编译dlib库,运行matrix_ex demo

本文介绍如何在AndroidStudio中创建支持C++的项目,并集成dlib库进行矩阵运算示例。通过详细步骤指导读者从创建项目、配置环境到实现C++功能的全过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

01 android studio 创建支持c++项目

打开android studio后,构建一个支持c++的项目,具体步骤如下:

01.01 Start a new Android Studio project

这里写图片描述

01.02 Configure your new project

Application name:dlib-android-build
Company domain:soft.example.com
勾选 Include C++ support
Project location:D:\git\dlib\build\dlib-android-build

这里写图片描述

01.03 Target Android Devices选择默认项

这里写图片描述

01.04 Add an Activity to Mobile 选择Basic Activity

这里写图片描述

01.05 Customize the Activity选择默认值

这里写图片描述

01.06 Customize C++ Support

C++ Standard 选择C++11
勾选 Exceptions Support(-fexceptions)
勾选 Runtime Type Information Support (-frtti)

这里写图片描述

02 导入dlib库,配置android属性

02.01 导入dlib库源码

把下载好的dlib目录中的dlib子目录,拷贝到D:\git\dlib\build\dlib-android-build\app\src\main\cpp中。

这里写图片描述

这里写图片描述

02.02 修改CMakeLists.txt配置项

修改D:\git\dlib\build\dlib-android-build\app\CMakeLists.txt配置项。
在add_library和find_library之间加入一句include(src/main/cpp/dlib/cmake)
在target_link_libraries中添加dlib
这里写图片描述

02.03 配置build.gradle

配置D:\git\dlib\build\dlib-android-build\app\build.gradle
在build.gradle的externalNativeBuild的cmake中添加arguments "-DANDROID_STL=c++_shared"
这里写图片描述

03 导入C++demo中的 matrix_ex

创建这个android项目,默认已经有native-lib.cpp文件,内容如下:

#include <jni.h>
#include <string>

extern "C"
JNIEXPORT jstring JNICALL
Java_com_example_soft_dlib_1android_1build_MainActivity_stringFromJNI(
        JNIEnv *env,
        jobject /* this */) {
    std::string hello = "Hello from C++";
    return env->NewStringUTF(hello.c_str());
}

dlib的github下载的源代码中,有dlib\examples\matrix_ex.cpp。因为stringFromJNI返回值是string类型,把matrix_ex 内容稍作修改,把默认输出改为字符串。拷贝到native-lib.cpp,最后native-lib.cpp的内容如下:

#include <jni.h>
#include <string>

#include <iostream>
#include <dlib/matrix.h>
#include <sstream>

using namespace dlib;
using namespace std;

// ----------------------------------------------------------------------------------------

string matrix_ex()
{
    stringstream ssout;
    // Let's begin this example by using the library to solve a simple
    // linear system.
    //
    // We will find the value of x such that y = M*x where
    //
    //      3.5
    // y =  1.2
    //      7.8
    //
    // and M is
    //
    //      54.2   7.4   12.1
    // M =  1      2     3
    //      5.9    0.05  1


    // First let's declare these 3 matrices.
    // This declares a matrix that contains doubles and has 3 rows and 1 column.
    // Moreover, it's size is a compile time constant since we put it inside the <>.
    matrix<double,3,1> y;
    // Make a 3 by 3 matrix of doubles for the M matrix.  In this case, M is
    // sized at runtime and can therefore be resized later by calling M.set_size().
    matrix<double> M(3,3);

    // You may be wondering why someone would want to specify the size of a
    // matrix at compile time when you don't have to.  The reason is two fold.
    // First, there is often a substantial performance improvement, especially
    // for small matrices, because it enables a number of optimizations that
    // otherwise would be impossible.  Second, the dlib::matrix object checks
    // these compile time sizes to ensure that the matrices are being used
    // correctly.  For example, if you attempt to compile the expression y*y you
    // will get a compiler error since that is not a legal matrix operation (the
    // matrix dimensions don't make sense as a matrix multiplication).  So if
    // you know the size of a matrix at compile time then it is always a good
    // idea to let the compiler know about it.




    // Now we need to initialize the y and M matrices and we can do so like this:
    M = 54.2,  7.4,  12.1,
            1,     2,    3,
            5.9,   0.05, 1;

    y = 3.5,
            1.2,
            7.8;


    // The solution to y = M*x can be obtained by multiplying the inverse of M
    // with y.  As an aside, you should *NEVER* use the auto keyword to capture
    // the output from a matrix expression.  So don't do this: auto x = inv(M)*y;
    // To understand why, read the matrix_expressions_ex.cpp example program.
    matrix<double> x = inv(M)*y;

    cout << "x: \n" << x << endl;
    ssout << "x: \n" << x << endl;

    // We can check that it really worked by plugging x back into the original equation
    // and subtracting y to see if we get a column vector with values all very close
    // to zero (Which is what happens.  Also, the values may not be exactly zero because
    // there may be some numerical error and round off).
    cout << "M*x - y: \n" << M*x - y << endl;
    ssout << "M*x - y: \n" << M*x - y << endl;


    // Also note that we can create run-time sized column or row vectors like so
    matrix<double,0,1> runtime_sized_column_vector;
    matrix<double,1,0> runtime_sized_row_vector;
    // and then they are sized by saying
    runtime_sized_column_vector.set_size(3);

    // Similarly, the x matrix can be resized by calling set_size(num rows, num columns).  For example
    x.set_size(3,4);  // x now has 3 rows and 4 columns.



    // The elements of a matrix are accessed using the () operator like so:
    cout << M(0,1) << endl;
    ssout << M(0,1) << endl;
    // The above expression prints out the value 7.4.  That is, the value of
    // the element at row 0 and column 1.

    // If we have a matrix that is a row or column vector.  That is, it contains either
    // a single row or a single column then we know that any access is always either
    // to row 0 or column 0 so we can omit that 0 and use the following syntax.
    cout << y(1) << endl;
    ssout << y(1) << endl;
    // The above expression prints out the value 1.2


    // Let's compute the sum of elements in the M matrix.
    double M_sum = 0;
    // loop over all the rows
    for (long r = 0; r < M.nr(); ++r)
    {
        // loop over all the columns
        for (long c = 0; c < M.nc(); ++c)
        {
            M_sum += M(r,c);
        }
    }
    cout << "sum of all elements in M is " << M_sum << endl;
    ssout << "sum of all elements in M is " << M_sum << endl;

    // The above code is just to show you how to loop over the elements of a matrix.  An
    // easier way to find this sum is to do the following:
    cout << "sum of all elements in M is " << sum(M) << endl;
    ssout << "sum of all elements in M is " << sum(M) << endl;



    // Note that you can always print a matrix to an output stream by saying:
    cout << M << endl;
    ssout << M << endl;
    // which will print:
    //   54.2  7.4 12.1
    //      1    2    3
    //    5.9 0.05    1

    // However, if you want to print using comma separators instead of spaces you can say:
    cout << csv << M << endl;
    ssout << csv << M << endl;
    // and you will instead get this as output:
    //   54.2, 7.4, 12.1
    //   1, 2, 3
    //   5.9, 0.05, 1

    // Conversely, you can also read in a matrix that uses either space, tab, or comma
    // separated values by uncommenting the following:
    // cin >> M;



    // -----------------------------  Comparison with MATLAB ------------------------------
    // Here I list a set of Matlab commands and their equivalent expressions using the dlib
    // matrix.  Note that there are a lot more functions defined for the dlib::matrix.  See
    // the HTML documentation for a full listing.

    matrix<double> A, B, C, D, E;
    matrix<int> Aint;
    matrix<long> Blong;

    // MATLAB: A = eye(3)
    A = identity_matrix<double>(3);

    // MATLAB: B = ones(3,4)
    B = ones_matrix<double>(3,4);

    // MATLAB: B = rand(3,4)
    B = randm(3,4);

    // MATLAB: C = 1.4*A
    C = 1.4*A;

    // MATLAB: D = A.*C
    D = pointwise_multiply(A,C);

    // MATLAB: E = A * B
    E = A*B;

    // MATLAB: E = A + B
    E = A + C;

    // MATLAB: E = A + 5
    E = A + 5;

    // MATLAB: E = E'
    E = trans(E);  // Note that if you want a conjugate transpose then you need to say conj(trans(E))

    // MATLAB: E = B' * B
    E = trans(B)*B;

    double var;
    // MATLAB: var = A(1,2)
    var = A(0,1); // dlib::matrix is 0 indexed rather than starting at 1 like Matlab.

    // MATLAB: C = round(C)
    C = round(C);

    // MATLAB: C = floor(C)
    C = floor(C);

    // MATLAB: C = ceil(C)
    C = ceil(C);

    // MATLAB: C = diag(B)
    C = diag(B);

    // MATLAB: B = cast(A, "int32")
    Aint = matrix_cast<int>(A);

    // MATLAB: A = B(1,:)
    A = rowm(B,0);

    // MATLAB: A = B([1:2],:)
    A = rowm(B,range(0,1));

    // MATLAB: A = B(:,1)
    A = colm(B,0);

    // MATLAB: A = [1:5]
    Blong = range(1,5);

    // MATLAB: A = [1:2:5]
    Blong = range(1,2,5);

    // MATLAB: A = B([1:3], [1:2])
    A = subm(B, range(0,2), range(0,1));
    // or equivalently
    A = subm(B, rectangle(0,0,1,2));


    // MATLAB: A = B([1:3], [1:2:4])
    A = subm(B, range(0,2), range(0,2,3));

    // MATLAB: B(:,:) = 5
    B = 5;
    // or equivalently
    set_all_elements(B,5);


    // MATLAB: B([1:2],[1,2]) = 7
    set_subm(B,range(0,1), range(0,1)) = 7;

    // MATLAB: B([1:3],[2:3]) = A
    set_subm(B,range(0,2), range(1,2)) = A;

    // MATLAB: B(:,1) = 4
    set_colm(B,0) = 4;

    // MATLAB: B(:,[1:2]) = 4
    set_colm(B,range(0,1)) = 4;

    // MATLAB: B(:,1) = B(:,2)
    set_colm(B,0) = colm(B,1);

    // MATLAB: B(1,:) = 4
    set_rowm(B,0) = 4;

    // MATLAB: B(1,:) = B(2,:)
    set_rowm(B,0) = rowm(B,1);

    // MATLAB: var = det(E' * E)
    var = det(trans(E)*E);

    // MATLAB: C = pinv(E)
    C = pinv(E);

    // MATLAB: C = inv(E)
    C = inv(E);

    // MATLAB: [A,B,C] = svd(E)
    svd(E,A,B,C);

    // MATLAB: A = chol(E,'lower')
    A = chol(E);

    // MATLAB: var = min(min(A))
    var = min(A);

    return ssout.str();
}

extern "C"
JNIEXPORT jstring JNICALL
Java_com_example_soft_dlib_1android_1build_MainActivity_stringFromJNI(
        JNIEnv *env,
        jobject /* this */) {
    //std::string hello = "Hello from C++";
    std::string hello = matrix_ex();
    return env->NewStringUTF(hello.c_str());
}

这里写图片描述

04 编译,调试

04.01 编译

选择Build==>Make Project菜单,或者Ctrl+F9键编译。
这里写图片描述

04.02 调试

选择Run==>Debug ‘app’菜单,或者Shift+F9键调试。
这里写图片描述

04.03 运行结果

这里写图片描述

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值