1.下载ndk设置环境变量,并设置支持jni
1.1 下载ndk 并设置环境变量
mac环境如:
export PATH=${PATH}:/Users/apple_mini/Library/Android/sdk/ndk/22.1.7171670
1.2 打开gradle.properties,添加:
android.useDeprecatedNdk=true
1.3 打开local.properties,添加:
ndk.dir=NDK的路径
2.新建java访问c层的接口类
package com.example.testapp;
public class MyJni {
static {
System.loadLibrary("MyJni");
}
public native static String getString();
}
3.生成头文件
3.1 "make-project"编译完成
3.2 打开终端,运行
//切换到对应目录(不同版本android studio 生成class文件目录不太一样 这里是4.2.1版本)
cd app/build/intermediates/javac/debug/
//执行生成头文件命令
javah com.example.testapp.MyJni
3.3 当前目录找到 com_example_testapp_MyJni.h文件
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_testapp_MyJni */
#ifndef _Included_com_example_testapp_MyJni
#define _Included_com_example_testapp_MyJni
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_example_testapp_MyJni
* Method: getString
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_example_testapp_MyJni_getString
(JNIEnv *, jclass);
#ifdef __cplusplus
}
#endif
#endif
4.app/src/main 目录下创建jni目录 并把com_example_testapp_MyJni.h 文件拷贝进来
4.1创建MyJni.c文件,(主要把头文件引入)
#include<jni.h>
#include<stdio.h>
//导入我们创建的头文件
#include "com_example_testapp_MyJni.h"
JNIEXPORT jstring JNICALL Java_com_example_testapp_MyJni_getString(JNIEnv *env, jclass){
//返回一个字符串
return (*env)->NewStringUTF(env,"This is my first NDK Application");
}
4.2 创建 Android.mk文件
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
#生成的模块名
LOCAL_MODULE := MyJni
#需要编译的c文件(可以是多个)
LOCAL_SRC_FILES := MyJni.c
include $(BUILD_SHARED_LIBRARY)
4.3 创建 Application.mk 文件 指定需要编译so库的cpu架构
APP_ABI := all
5.开始编译so文件
cd 到 app/src/main/jni 目录并执行 ndk-build命令即可在 app/src/main/libs目录 生成so文件
cd app/src/main/jni
//执行
ndk-build
6.使用so文件
6.1 把对应cpu架构文件夹和及so文件,复制到 app/libs目录
6.2 build.gradle文件 android-》defaultConfig 里面添加支持cpu架构如下:
ndk {
abiFilters 'armeabi-v7a','x86'
}
6.3 build.gradle文件 android层级 里面添加app/libs读取so文件 如下:
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
repositories {
flatDir {
dirs 'libs'
}
}
7 调用本地方法即可
//调用native本地方法
System.out.println("jni_str:" + MyJni.getString());
//输出结果
2021-08-05 14:49:14.358 11709-11793/com.example.testapp I/System.out: jni_str:This is my first NDK Application
网友评论