欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

CMake 进行 NDK 开发之初体验,> Error occurred while communicating with CMake server

程序员文章站 2024-03-14 10:13:46
...

 Error occurred while communicating with CMake server

CMake 进行 NDK 开发之初体验,> Error occurred while communicating with CMake server

 

https://www.jianshu.com/p/716641d15ee8

2.1 安装组件

在新建项目之前,我们需要通过SDK Manager安装一些必要的组件:

  • NDK
  • CMake
  • LLDB

CMake 进行 NDK 开发之初体验,> Error occurred while communicating with CMake server

2.2 创建工程

在安装完必要的组件之后,我们创建一个全新的工程,这里需要记得勾选include C++ Support选项:

CMake 进行 NDK 开发之初体验,> Error occurred while communicating with CMake server


接下来一路Next,在最后一步我们会看见如下的几个选项,它们的含义为:

 

  • C++ Standard:选择C++的标准,Toolchain Default表示使用默认的CMake配置,这里我们选择默认。
  • Excptions Support:如果您希望启用对C++异常处理的支持,请选中此复选框。如果启用此复选框,Android Studio会将-fexceptions标志添加到模块级 build.gradle文件的cppFlags中,Gradle会将其传递到CMake
  • Runtime Type information Support:如果您希望支持RTTI,请选中此复选框。如果启用此复选框,Android Studio会将-frtti标志添加到模块级 build.gradle文件的cppFlags中,Gradle会将其传递到CMake

CMake 进行 NDK 开发之初体验,> Error occurred while communicating with CMake server

 

在新建工程完毕之后,我们得到的工程的结构如下图所示:

 

CMake 进行 NDK 开发之初体验,> Error occurred while communicating with CMake server

 

与传统的工程相比,它有如下几点区别:

(1) cpp 文件夹

用于存放C/C++的源文件,在磁盘上对应于app/src/main/cpp文件夹,当新建工程时,它会生成一个native-lib.cpp的事例文件,其内容如下:

 

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

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

(2) 增加 CMakeList.txt 脚本

构建脚本,在磁盘上对应于app/目录下的txt文件,其内容为如下图所示,这里面涉及到的CMake语法包括下面四种,关于CMake的语法,可以查看 官方的 API 说明

  • cmake_minimum_required
  • add_library
  • find_library
  • target_link_libraries

 

(3) build.gradle 脚本

与传统的项目相比,该模块所对应的build.gradle需要在里面指定CMakeList.txt所在的路径,也就是下面externalNativeBuild对应的选项。

 

apply plugin: 'com.android.application'

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.3"
    defaultConfig {
        applicationId "com.demo.lizejun.cmakenewdemo"
        minSdkVersion 15
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        externalNativeBuild {
            cmake {
                cppFlags ""
            }
        }
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:25.3.1'
    testCompile 'junit:junit:4.12'
    compile 'com.android.support.constraint:constraint-layout:1.0.2'
}

(4) 打印字符串

MainActivity中,我们加载原生库,并调用原生库中的方法获取了一个字符串展示在界面上:

 

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // Example of a call to a native method
        TextView tv = (TextView) findViewById(R.id.sample_text);
        tv.setText(stringFromJNI());
    }

    /**
     * A native method that is implemented by the 'native-lib' native library,
     * which is packaged with this application.
     */
    public native String stringFromJNI();

    // Used to load the 'native-lib' library on application startup.
    static {
        System.loadLibrary("native-lib");
    }
}

(5) 运行结果

最后,我们运行一下这个工程,会得到下面的结果:

CMake 进行 NDK 开发之初体验,> Error occurred while communicating with CMake server


通过APK Analyzer工具,我们可以看到在APK当中,增加了libnative-lib.so文件:

CMake 进行 NDK 开发之初体验,> Error occurred while communicating with CMake server

 

相关标签: 2020安卓

上一篇: ElasticSearch性能调优

下一篇: