前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Android NDK 开发】Kotlin 语言中使用 NDK ( 创建支持 Kotlin 的 NDK 项目 | Kotlin 语言中使用 NDK 要点 | 代码示例 )

【Android NDK 开发】Kotlin 语言中使用 NDK ( 创建支持 Kotlin 的 NDK 项目 | Kotlin 语言中使用 NDK 要点 | 代码示例 )

作者头像
韩曙亮
发布2023-03-28 20:04:47
9940
发布2023-03-28 20:04:47
举报
文章被收录于专栏:韩曙亮的移动开发专栏

文章目录

一、创建支持 Kotlin 的 NDK 项目


点击 菜单栏 / File / New / New Project / Create New Project , 弹出以下对话框 , 选择 Native C++ 项目 , 点击 Next 按钮 ;

在后续对话框中 , 使用默认的 Kotlin 语言 , 即可生成 Kotlin 中使用 NDK 的代码 ;

默认 C++ 标准即可 ;

二、Kotlin 语言中使用 NDK 要点


1、加载动态库


Kotlin 中在类的 companion object 伴生对象 中加载动态库 , 类似于 Java 的静态代码块 ;

代码语言:javascript
复制
    companion object {
        // Used to load the 'native-lib' library on application startup.
        init {
            System.loadLibrary("native-lib")
        }
    }

2、声明 ndk 方法


Java 中使用 native 声明 ndk 方法 , 在 Kotlin 中 , 使用 external 声明 ndk 方法 ;

代码语言:javascript
复制
    /**
     * A native method that is implemented by the 'native-lib' native library,
     * which is packaged with this application.
     */
    external fun stringFromJNI(): String

ndk 方法对应的 C++ 方法 ;

代码语言:javascript
复制
#include <jni.h>
#include <string>

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

3、Project 下的 build.gradle 配置


需要配置 Kotlin 版本号 , 和 Kotlin 插件版本号 ;

代码语言:javascript
复制
buildscript {
    ext.kotlin_version = "1.4.10"
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

4、Module 下的 build.gradle 配置


在 Module 下的 build.gradle 中 ,

kotlin-android 是必须配置的 ,

kotlin-android-extensions 是扩展 , 选择性配置 , 配置了之后 , 可以很方便地使用视图绑定 ;

kotlin-kapt 也是选择性配置 , 配置使用注解 ;

代码语言:javascript
复制
plugins {
    id 'com.android.application'
    id 'kotlin-android'
    id 'kotlin-android-extensions'
    id 'kotlin-kapt'
}

三、代码示例


1、Java 代码


代码语言:javascript
复制
package kim.hsl.ndk_kotlin

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.TextView

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // Example of a call to a native method
        findViewById<TextView>(R.id.sample_text).text = stringFromJNI()
    }

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

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

2、C++ 代码


代码语言:javascript
复制
#include <jni.h>
#include <string>

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

3、Project 下的 build.gradle


代码语言:javascript
复制
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
    ext.kotlin_version = "1.4.10"
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath "com.android.tools.build:gradle:4.1.0"
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        google()
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

4、Module 下的 build.gradle


代码语言:javascript
复制
plugins {
    id 'com.android.application'
    id 'kotlin-android'
    id 'kotlin-android-extensions'
    id 'kotlin-kapt'
}

android {
    compileSdkVersion 29
    buildToolsVersion "30.0.2"

    defaultConfig {
        applicationId "kim.hsl.ndk_kotlin"
        minSdkVersion 18
        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"
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    kotlinOptions {
        jvmTarget = '1.8'
    }
}

dependencies {

    implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
    implementation 'androidx.core:core-ktx:1.3.2'
    implementation 'androidx.appcompat:appcompat:1.2.0'
    implementation 'com.google.android.material:material:1.2.1'
    implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
    testImplementation 'junit:junit:4.+'
    androidTestImplementation 'androidx.test.ext:junit:1.1.2'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
}

5、执行效果


四、GitHub 地址

https://github.com/han1202012/NDK_Kotlin

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-12-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 一、创建支持 Kotlin 的 NDK 项目
  • 二、Kotlin 语言中使用 NDK 要点
    • 1、加载动态库
      • 2、声明 ndk 方法
        • 3、Project 下的 build.gradle 配置
          • 4、Module 下的 build.gradle 配置
          • 三、代码示例
            • 1、Java 代码
              • 2、C++ 代码
                • 3、Project 下的 build.gradle
                  • 4、Module 下的 build.gradle
                    • 5、执行效果
                    • 四、GitHub 地址
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档