如何在android studio中编写CMakeLists来调用我的c ++项目(JNI)中的函数

时间:2017-03-14 06:27:15

标签: c++ android-studio cmake java-native-interface

我是Android Studio的新手。我已经构建了一个c ++项目,其中包含.cc.h个文件。但我想通过Android Studio 2.2开发的应用来执行它们。我已经搜索了Add C and C++ Code to Your Project之类的教程,以了解如何撰写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::UT_CaffeEvaWrapper();中涉及的函数UnitTest.cc来将其结果发布到我的Android手机上。

即使我使用谷歌提供的演示HellpJNI进行了一些更改,例如添加我自己的文件,也会显示错误:

Unfortunately, Q_CNN has stopped.

但是make build可以没有任何错误。我不知道如何制作它。那么有谁可以帮助我吗?指定的教程也行。提前谢谢!

1 个答案:

答案 0 :(得分:0)

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

const std :: string kClsNameFilePath =" /home/zz/AndroidStudioProjects/Q_CNN/app/src/main/assets/Cls.Names/class_names.txt" ;;   const std :: string kImgLablFilePath =" /home/zz/AndroidStudioProjects/Q_CNN/app/src/main/assets/Cls.Names/image_labels.txt" ;;   const std :: string kBmpFilePath =" /home/zz/AndroidStudioProjects/Q_CNN/app/src/main/assets/Bmp.Files/ILSVRC2012_val_00000009.BMP" ;;

但是当我调试时,我发现

FILE * inFile = fopen(filePath.c_str()," r");

指针inFile为null。我不知道如何解决这个问题。

最后,我通过将我的文件放在手机下解决了这个问题!以下步骤是访问你的SD卡!你还应该通过在AndroidManifest.xml中添加行来打开权限