Android JNI 청소년 Cmake(안드로이드 스튜디오)

기원

인생은 현재만이 아니라 시와 거리이기도 하다. 당신이 신참이고 수천 명의 사람들이 존경하는 위대한 신이 되고 싶다면 먼저 작은 목표를 설정하는 것이 좋습니다. 예를 들어 먼저 200년을 살고 하늘에서 또 다른 500년을 빌리는 것입니다. 글쎄요, 처음 들었을 때 전생에 서로가 있었던 것처럼 심장이 멈추지 않고 떨렸지만 이번 생에서는 오랫동안 오랫동안 기다렸습니다. 크로스 플랫폼 조작의 스크립트, 간단한 스타일, 청소년기의 cmake, 활기찬 활력과 활력, 사람들은 그것에 매료되지 않을 수 없습니다.

소개하다

씨메이크란? 거대 바이두는 “
CMake는 모든 플랫폼의 설치(컴파일 프로세스)를 간단한 문장으로 설명할 수 있는 크로스 플랫폼 설치 도구다. 다양한 makefile 또는 프로젝트 파일을 출력할 수 있으며 UNIX의 automake와 유사하게 지원되는 C++ 기능을 테스트할 수 있습니다. CMake는 어댑터(래퍼)를 컴파일, 생성, 생성하고 어떤 순서로든 빌드할 수 있습니다. CMake는 in-place 빌드(동일한 디렉터리 트리의 바이너리 파일 및 소스 코드) 및 out-of-place 빌드(다른 디렉터리의 바이너리 파일)를 지원하므로 동일한 소스 코드 디렉터리 트리에서 쉽게 빌드할 수 있습니다. . CMake는 또한 정적 및 동적 라이브러리 구성을 지원합니다. "CMake"라는 이름은 "cross platform make"의 줄임말입니다.
간단히 말해서, 우리에게는 그렇게 생성하는 것입니다.

준비

cmake의 경우 지원이 약간 늦어서 2.2 이후까지 시작되지 않았습니다. 따라서 as 버전이 낮으신 분들은 업그레이드 하시고 불편하신 점은 구글 고객센터로 문의 부탁드립니다. 업그레이드가 완료된 후 SDKManager를 열면 여전히 설치해야 하는 몇 가지 작은 플러그인이 있습니다. 예를 들어 cmake 플러그인은 설치하지 않으면 설치할 수 없습니다.If, if라고 하면 여기에 if가 없어서 죄송합니다. 예를 들어 NDK 플러그인(공식 용어로 네이티브 개발 키트)을 사용하면 Android용 C 및 C++ 코드를 사용할 수 있으며 많은 플랫폼 라이브러리를 제공합니다. 예를 들어 LLDB 플러그인, 네이티브 코드 디버깅, 선택 사항, 권장 사항입니다.
상황지도 확인
위의 사진은 공식 웹사이트 문서에서 가져온 것이므로 필요한 항목은 개별적으로 확인하시기 바랍니다. 귀찮으시면 클릭 한번으로 다 체크하시고 3박 3일만 참으시면 제가 손발 다해 응원하겠습니다.

여행이 시작된다

선생님을 떠나기 전에 죽었어, 아 bah, this, this, 주제로 돌아가서 hello jni의 여정을 시작합시다. 하나의 대상(프로젝트는 cmake를 지원함), 두 개의 경로. 바로 가기 중 하나에 대해 새 프로젝트를 생성하고 C++ 지원 포함 확인란을 선택합니다. 이런 식으로, 다음 단계, 다음 단계, 설명할 것이 없습니다.
C++ 지원 확인란 포함
다른 하나는 여러 단계로 기존 프로젝트에서 cmake를 지원하는 것입니다.
1단계. src/main 디렉토리 아래에 디렉토리를 만들고 이름을 cpp로 지정합니다. 이 이름은 마음에 드는 한 임의적입니다. 임포트해야 하는 코드를 생성된 디렉토리에 넣습니다. 여기에서 임의로 작성하거나 감정적으로 반응하지 마십시오.
2단계. CMakeLists.txt라는 이름의 일반 텍스트 파일인 CMake 빌드 스크립트를 생성합니다. 이 이름은 고정된 형식을 가지며 성질이 허용되지 않습니다. 이 파일을 어디에 둘 것인지는 당신에게 달려 있습니다.
내 선택
3단계. 앱 모듈의 build.gradle 파일에서 cmake 지원을 제공합니다.

android{
    ...
    externalNativeBuild {
        cmake {
            path "src/main/cpp/CMakeLists.txt"
        }
    }
}

첫 번째 구성은 Native Build 메서드가 cmake임을 선언하고 cmake 스크립트 경로를 지정합니다.

android{
    ...
    defaultConfig{
      ...
      externalNativeBuild {
            cmake {
                cppFlags "-std=c++11 -frtti -fexceptions"
            }
        }
    }
}

요, 지나갈 때 놓치지 마세요. 두 번째 구성은 c11++ 표준과 같은 cmake 컴파일을 위한 조건을 설정합니다. externalNativeBuild도 마찬가지입니다. 여기는 defaultConfig 도메인이고 cmake 경로는 android 도메인입니다. 때때로 저는 두 가지를 하나로 결합하여 두 번 작성해야 하는 것이 어떨지 생각합니다. 머리가 아프고 이해가 되지 않습니다.

여정의 핵심, cmake 구성

cmake의 문서인 E-text는 사람들을 도취시키고 빠져나오지 못하게 합니다. 더 중요한 API가 너무 적습니다.
중요 1. add_library, lib 생성. 우리에게는 System.loadLibrary("xxx")가 있습니다. 여기서 xxx는 lib입니다. 예는 다음과 같습니다.

# 创建一个 lib,静态 or 动态,可创建多个
add_library( # lib名称
             JniDemo

             # lib类型
             SHARED

             # .c/cpp目录
             jni_dynamic.cpp )

중요 2. .a와 같은 빌드된 라이브러리를 사용하는 데 사용되는 set_target_properties. 예는 다음과 같습니다.

# 添加自己的 lib 库
add_library( libHello
             SHARED
             # 由于.a 已经属于已经构建好的库,使用 IMPORTED 标志,告诉 cmake 不需要编译了
             IMPORTED )

set_target_properties(
                    #名称
                    libHello

                    # 指定要定义的参数.
                    PROPERTIES IMPORTED_LOCATION

                    # 导入 lib 的路径
                    ${CMAKE_SOURCE_DIR}/sources/${ANDROID_ABI}/libHello.a)

중요 3. find_library, lib 찾기. 예는 다음과 같습니다.

# 搜索 NDK 指定 lib
find_library( # lib 路径变量的名称。
              log-lib

              # 查找指定 lib 名称
              log )

중요 4. target_link_libraries, 모든 라이브러리를 연결하여 새 라이브러리를 생성합니다. 예는 다음과 같습니다.

# 链接库
target_link_libraries( # 指定目标 lib
                       JniDemo

                       # 自己的 lib
                       libHello

                       # NDK log lib  //这里放 find 的路径 ${log-lib} 也是可以
                       log )

당분간은 이 몇 가지에 대해서만 이야기합시다. 기본적으로 거의 충분할 것입니다. 그렇다면 cmake 문서를 자유롭게 확인하십시오. 마음에 드실 것입니다. 여기서 한 가지 언급할 것이 있는데, 위의 4가지 항목에 관해서는 그 중 2가지가 가장 중요합니다. 요점 1은 lib를 생성하고 java와 c/c++ 사이에 브리지를 구축하는 것입니다. 요점 4는 모든 라이브러리를 연결하여 완전한 실행 가능한 라이브러리를 구축하는 것입니다. 이 두 가지는 기본적으로 문제를 해결할 수 있습니다. 중복되는 두 가지 핵심 사항은 더 명확한 구조를 위해 직관적입니다.

여행의 기쁨을 나누다

이 시점에서 jni는 끝났습니다. 이전에 생각한대로라면 만족스럽고 행복한 결말이라고 할 수 있습니다. 내가 jni를 그렇게 진지하게 받아들이는 이유는 내가 기꺼이 하고 그것을 좋아하기 때문입니다. jni에 대한 나의 지식과 이해를 대가로 이것을 사용할 수 있다면 분명 기쁠 것입니다. 그렇지 않다면 후회할 것이 없습니다.
광활한 세계를 경험할 수 있는 github 티켓이 첨부되어 있습니다.

추천

출처blog.csdn.net/youyi300200/article/details/73477654