Сборка библиотеки c ++ с использованием CMake в Android Studio - PullRequest
0 голосов
/ 21 июня 2019

Я собрал эту библиотеку C ++ с использованием CMake 3.10.2 в Ubuntu 18.04, и она была успешно собрана.Я пытаюсь построить его, используя тот же CMakeLists.txt и структуру папок в Android Studio, которая также использует Cmake 3.10.2.

При запуске результатов проверки в Android Studio, в C ++, в порядке объявления, он дал мне несколько ошибок, которые, как я понял, при сборке в Ubuntu, в моей папке сборки были заполнены определенными папками и файлами, которые содержалифайлы заголовков, но после сборки в Android Studio и поиска в папке сборки по умолчанию я не смог найти ничего похожего удаленно.Чем CMake работает в Android Studio иначе, чем CMake, скажем, в Ubuntu?

РЕДАКТИРОВАТЬ:

В Ubuntu мой CMakeLists.txt был следующим:

cmake_minimum_required(VERSION 3.6)
project(main CXX C)
add_executable(main main.cpp)
target_include_directories(main PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/include
${CMAKE_CURRENT_SOURCE_DIR}/build/deps/yara/src/yara/libyara/include)
target_link_libraries (main
-L${CMAKE_CURRENT_SOURCE_DIR}/build/src/
-L${CMAKE_CURRENT_SOURCE_DIR}/build/deps/yara/src/yara/libyara/.libs
yaracpp yara pthread ssl crypto)

Где main.cpp:

#include <iostream>
#include "yaracpp/yaracpp.h"
int main() {
yaracpp::YaraDetector yara;
yara.addRules(R"(
import "hash"
rule example {
strings:
$s = "Hello"
condition:
$s
})");
if (yara.analyze("test_file")) {

    for (const auto& rule : yara.getDetectedRules()) {
        std::cout << rule << '\n';

    }   
  }
}

При запуске ./main, я получил ожидаемый результат.

Мой build.gradle (модуль) в AndroidStudio выглядит следующим образом:

apply plugin: 'com.android.application'
android {
compileSdkVersion 29
buildToolsVersion "29.0.0"
defaultConfig {
applicationId "com.example.a12"
minSdkVersion 15
targetSdkVersion 29
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
externalNativeBuild {
cmake {
cppFlags ""
}
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
externalNativeBuild {
cmake {
path "src/main/cpp/CMakeLists.txt"
version "3.10.2"
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.0.2'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test?1.2.0'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}

CMakeLists.txt, который я использую в Android Studio, почти аналогичен тому, который я использовал для Ubuntu, только незначительные изменения, такие как замена add_exectuable () на add_library () какДля Android Studio потребуется библиотека C ++, а не исполняемый файл.Это выглядит следующим образом:

cmake_minimum_required(VERSION 3.6)
project(main CXX C)
add_library(main native-lib.cpp)
target_include_directories(main PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/include
${CMAKE_CURRENT_SOURCE_DIR}/build/deps/yara/src/yara/libyara/include)
target_link_libraries (main
-L${CMAKE_CURRENT_SOURCE_DIR}/build/src/
-L${CMAKE_CURRENT_SOURCE_DIR}/build/deps/yara/src/yara/libyara/.libs
yaracpp yara pthread ssl crypto)

Мой native-lib.cpp:

#include <jni.h>
#include <iostream>
#include <string>
#include "yaracpp/yaracpp.h"
extern "C" JNIEXPORT jstring JNICALL
Java_com_example_a12_MainActivity_stringFromJNI(
JNIEnv env,
jobject / this */) {
yaracpp::YaraDetector yara;
yara.addRules(R"(
import "hash"
    rule example {
        strings:
            $s = "Hello"
        condition:
            $s
    })");
if (yara.analyze("test_file")) {

    for (const auto& rule : yara.getDetectedRules()) {
        std::cout << rule << '\n';
        std::string rule1 = rule;
        return env->NewStringUTF(rule1.c_str());         
    }       
  }
}

Когда я попал в Build-> Make project, он успешно скомпилирован, но приложение вылетаетмомент, когда я открываю это.Когда я пошел в Анализ-> Проверить код, я получил это в результатах проверки:

https://user -images.githubusercontent.com / 19466518 / 59972449-343ffb80-95ad-11e9-9540-a14d57ac16b8.png

https://user -images.githubusercontent.com / 19466518 / 59972451-3efa9080-95ad-11e9-938a-e4c72942e5b0.png

https://user -images.githubusercontent.com / 19466518 / 59972454-4883f880-95ad-11e9-8ceb-c67587ae84c3.png

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...