安卓开发 JNI初探

安卓开发 JNI初探

1.在AndroidStudio 下载NDK 版本可以根据自己的需要选择,默认可以选最新的版本

在这里插入图片描述

2.NDK下载完成后,默认下载位置:C:\Users\Xcy\AppData\Local\Android\Sdk\ndk\25.2.9519653

在这里插入图片描述
现在我们开始在环境变量中配置
在这里插入图片描述
选中此电脑,右击打开属性
在这里插入图片描述
在这里插入图片描述
选中高级系统设置,点击进入环境变量
在这里插入图片描述
注意:在用户变量中找到Path ,将刚刚安装的NDk目录粘贴进去。 (这里按我的安装目录举例)C:\Users\Xcy\AppData\Local\Android\Sdk\ndk\25.2.9519653

打开CMD窗口,验证配置是否成功

在这里插入图片描述

准备工作做好后,正片开始 @@

在这里插入图片描述
在这里插入图片描述

在Java文件中写native方法

在这里插入图片描述

JNI.java
package com.xcy.mystudyjni;

/**
 * 作用:Java调用对应的C代码
 *
 * 快速生成.h文件
 * javac -encoding utf-8 -h . JNI.java
 *
 */
public class JNI {

    static {
        System.loadLibrary("Hello");
    }

    /**
     * 定义native方法
     * 调用C代码对应的方法
     *
     * @return
     */
    public native String sayHello();

}

在Termial控制台中cd到项目目录中的jni目录下,并执行 javac -encoding utf-8 -h . JNI.java 命令生成.h文件

在这里插入图片描述
在这里插入图片描述

执行命令后,项目目录中会生成一个JNI.class 与根据JNI.class 生成 .h文件,现在在项目main目录下创建jni文件夹,将.h文件copy到jni文件夹中

在这里插入图片描述

在jni目录中创建一个.c的文件开始编写C语言

Hello.c
#include<stdio.h>
#include<stdlib.h>
#include<jni.h>
#include<com_xcy_mystudyjni_JNI.h>

//注意:这里引入的#include<com_xcy_mystudyjni_JNI.h> 名称对应你jni中生成的.h文件
//这里方法中的名称 Java_com_xcy_mystudyjni_JNI_sayHello 对应 jni中生成的.h文件中的名称
JNIEXPORT jstring JNICALL Java_com_xcy_mystudyjni_JNI_sayHello(JNIEnv* env,jobject jobj){
    char* text = "Hello JNI!";
    return (*env)->NewStringUTF(env,text);
}

接在在jni目录中创建Android.mk 和 Application.mk

Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := Hello
LOCAL_SRC_FILES := Hello.c
include $(BUILD_SHARED_LIBRARY)
Application.mk
APP_ABI := all
APP_PLATFORM := android-19

现在开始配置gradle文件

在这里插入图片描述

build.gradle
plugins {
    id 'com.android.application'
    id 'org.jetbrains.kotlin.android'
}

android {
    namespace 'com.xcy.mystudyjni'
    compileSdk 33

    defaultConfig {
        applicationId "com.xcy.mystudyjni"
        minSdk 21
        targetSdk 33
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

        //指定生成哪些架构中的so包
        ndk{
            moduleName "Hello"//so文件 lib+moduleName+.so
            abiFilters "armeabi","armeabi-v7a","x86","x86_64" //cpu类型
        }
    }

    sourceSets.main {
        //有些项目是这个目录,根据你的实际情况填写你c代码的目录即可
        jni.srcDirs = ['src\\main\\jni']
        jniLibs.srcDirs = ['src\\main\\libs']
    }

    ndkVersion '25.2.9519653'

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    kotlinOptions {
        jvmTarget = '1.8'
    }
}

dependencies {

    implementation 'androidx.core:core-ktx:1.8.0'
    implementation 'androidx.appcompat:appcompat:1.4.1'
    implementation 'com.google.android.material:material:1.5.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.1.3'
    testImplementation 'junit:junit:4.13.2'
    androidTestImplementation 'androidx.test.ext:junit:1.1.3'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
}

然后在gradle.properties 中添加 android.useDeprecatedNdk=true

在这里插入图片描述

然后在local.properties 文件中添加ndk目录

在这里插入图片描述

现在配置工作结束,可以开始生成.so包了

在这里插入图片描述

在Termial控制台中cd到项目目录中的jni目录下,并执行 ndk-build 命令,然后就可以在与jni同级的libs中找到对应的so包

在这里插入图片描述

然后在MainActivity中调用方法就实现JNI

在这里插入图片描述

MainActivity.kt
package com.xcy.mystudyjni

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)

        var tv = findViewById<TextView>(R.id.tv)
        tv.text = JNI().sayHello()
    }
}

完结撒花,至此你已经掌握了JNI开发,如果有问题可以私聊我,需要demo的话可以在文章下方评论

在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

徐小歌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值