• android studio 2.2 使用cmake编译NDK


    Android studio 2.2 已经进入beta版本,新功能添加众多,NDK编程也得到了简化。官方博客介绍。本文介绍如何使用新版android studio调用 c++代码,为了超级通俗易懂,例子是最最最基本的例子,就是调用c++代码所需的最基本的地方,其余的自行添加即可。

    1.下载最新版android studio 2.2

    2.新建一个不添加c++的工程(为了亲自添加好知道添加时需要改动什么地方)

    新建文件
    之后一路下一步就好了。这里我们选择Empty Activity。(假设你已经会了安卓开发了)

    3.新建cpp文件夹、c++文件、jni相关的c++文件

    1. 切换到project列表,找到main目录,在main目录下新建cpp文件夹:
      新建cpp文件夹
    2. 右击cpp文件夹,分开新建c++ source File和c++ header file,就叫Max.cpp 和 Max.h好了(命名就用大驼峰了,有知道该用啥的欢迎指正),比较两个数大小并返回最大的那个。图片下一步后一起上。
    3. 再只建立一个c++ source文件用来存放jni相关文件,随便起个叫native-lib.cpp。以上步骤完成后是这样的:
      新建各种文件
    4. 写Max.cpp(这就是完整的文件了,就这个函数也没啥要用的头文件…)
    int max(int a, int b)
    {
        return a > b ? a : b;
    }
    1. 写Max.h(也是完整的)
    #ifndef CMAKETEST_MAX_H_H
    #define CMAKETEST_MAX_H_H
    
    int max(int a, int b);
    
    #endif //CMAKETEST_MAX_H_H
    1. 写native-lib.cpp(还是完整的)
    #include <jni.h>
    #include "Max.h"
    
    extern "C" {
    
        jint 
        Java_cc_liyongzhi_cmaketest_MainActivity_maxFromJNI(
                 JNIEnv* env,
                 jobject object, 
                 jint a, 
                 jint b)
        {
            return max(a,b);
        }
    
    }

    其中extern “C” 是表示可以供外部调用。
    jint是返回值,maxFromJNI是Java代码中定义的函数。(过会儿会写在MainActivity里)
    Java_cc_liyongzhi_cmaketest_MainActivity_这一段是调用这个函数的java类以及它所在的包。
    JNIEnv* env 和 jobject object是啥我也不知道,很显然这俩必须要用。
    jint a和jint b是java中输入的用来比较大小的俩数。
    return的max是Max.h里的max(a,b)。

    3.新建CMakeLists.txt

    依然是完整的文件:

    # 指定cmake最低版本,如果不知道就复制吧
    cmake_minimum_required(VERSION 3.4.1)
    
    # 第一个native-lib是供java调用的文件, SHARED是啥没看明白但是要写上
    # 最后俩是所有cpp的名字和相对本文件的位置,这里在一个文件夹中就直接写名字了,文件有多少写多少
    add_library(native-lib SHARED native-lib.cpp Max.cpp)
    
    # 我的理解是java要连接到native-lib,和一些其它的东西,不懂
    target_link_libraries(native-lib)
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    4.修改build.gradle(src文件夹里的,不是工程的)

    apply plugin: 'com.android.application'
    
    android {
        compileSdkVersion 24
        buildToolsVersion "24.0.0"
        defaultConfig {
            applicationId "cc.liyongzhi.cmaketest"
            minSdkVersion 15
            targetSdkVersion 24
            versionCode 1
            versionName "1.0"
            testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
            //--------------------------------------------------------------------------
            externalNativeBuild {
                cmake {
                    abiFilters 'x86', 'x86_64', 'armeabi', 'armeabi-v7a', 'arm64-v8a'
                }
            }
            //^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
            //| | | | | | | | | | | | | |
            //这上面这一些
    
        }
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
        }
        //-------------------------------------------
        externalNativeBuild {
            cmake {
                path "src/main/cpp/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:24.1.1'
        testCompile 'junit:junit:4.12'
    }
    

    5.完善app的java部分。

    MainActivity:

    package cc.liyongzhi.cmaketest;
    
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.widget.TextView;
    
    public class MainActivity extends AppCompatActivity {
    
        //这一段必须要写!意思是加载这个native-lib里的函数和东西
        static {
            System.loadLibrary("native-lib");
        }
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            TextView view = new TextView(this);
            view.setText(String.valueOf(maxFromJNI(5, 600)));
            setContentView(view);
    
        }
    
        //调用的时候就这么调就好了,这就是在native-lib里的函数
        public static native int maxFromJNI(int a, int b);
    }

    6.大功告成!

  • 相关阅读:
    写在毕业季前
    使用Github Page鼓励自己每日编程
    win8/Metro开发系列一 Xaml布局
    AlertDialog详解
    安卓项目文件目录
    Andriod布局之LinearLayout
    Andriod定时任务
    android 设置布局横屏竖屏
    Android默认启动程序问题
    Android全屏显示
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/6150239.html
Copyright © 2020-2023  润新知