如何在Android Studio中编写CMakelists来调用我的C 项目(JNI)的功能

How to write CMakeLists in android studio to call functions from my c++project (JNI)

本文关键字:项目 我的 JNI 功能 调用 Android Studio CMakelists      更新时间:2023-10-16

我是Android Studio的新手。我构建了一个C 项目,其中包含.cc.h文件。但是我想通过Android Studio 2.2开发的应用程序执行它们。我已经搜索了您的项目中的添加C和C 代码,以了解如何编写CMakeLists.txt

这是我的CMakeLists.txt

cmake_minimum_required(VERSION 3.4.1)
INCLUDE_DIRECTORIES(src/main/include/)
add_library(
             native-lib
             SHARED
             src/main/cpp/native-lib.cpp
              )
add_library(
             UnitTest
             STATIC
             src/main/cpp/UnitTest.cc
              )
add_library(
             CaffeEva
             STATIC
             src/main/cpp/CaffeEva.cc
              )
add_library(
             CaffeEvaWrapper
             STATIC
             src/main/cpp/CaffeEvaWrapper.cc
              )
add_library(
             BmpImgIO
             STATIC
             src/main/cpp/BmpImgIO.cc
              )
add_library(
            BlasWrapper
             STATIC
             src/main/cpp/BlasWrapper.cc
              )
add_library(
             CaffePara
             STATIC
             src/main/cpp/CaffePara.cc
              )
find_library(  
              log-lib
              log )
target_link_libraries(  
                       native-lib
                        UnitTest
                        CaffeEva
                        CaffeEvaWrapper
                        BmpImgIO
                        BlasWrapper
                        CaffePara 
                       ${log-lib} )

编译我的源.cc文件和.h文件。

我的目的是调用JNI参与UnitTest.cc涉及的函数UnitTest::UT_CaffeEvaWrapper();,以将其结果放在我的Android手机上。

即使我使用Google提供的演示HellpJNI,还有一些更改,例如向其添加我自己的文件,它显示错误:

Unfortunately, Q_CNN has stopped.

但是,构建可以没有任何错误。我不知道该怎么做。那么有人可以帮助我吗?指定的教程也可以。预先感谢!

我已经逐步调试我的程序。我发现是错误的文件目录路径会导致此问题。我的文件文件夹是:

const std :: string kclsnamefilepath ="/home/zz/androidstudioprojects/q_cnn/app/src/src/main/assets/cls.names/class_names.txt"; const std :: string kimglablfilepath ="//home/zz/androidstudioprojects/q_cnn/app/src/src/main/assets/cls.names/image_labels.txt"; const std :: string kbmpfilepath ="/home/zz/androidstudioprojects/q_cnn/app/src/src/main/main/assets/bmp.files/ilsvrc2012_val_000000000009.bmp"

但是当我调试时,我发现

file* infile = fopen(filepath.c_str()," r");

指针插入了无效。我不知道如何解决这个问题。

最后,我通过将文件放在手机下解决了!以下步骤是访问您的sdcard!您也应该通过在androidmanifest.xml中添加行

来打开权威。