安卓开发 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的话可以在文章下方评论