题记:现有在工程中需要用JNI来简化及拓展APK功能
一,安装及配置NDK
进入SDK manager 勾选NDK,然后Apply一下,等待安装完成
配置环境变量:
新建环境变量,路径为AS在sdk路径中安装的./ndk-bundle
然后在path中添加上图定义的%NDK_ROOT%
dos窗口可以敲出ndk-build指令即配置完成,因为cmd路径下啥都没,所以当前啥都build不出来。
二,在AS中使用JNI
首先需要根据需求写对应的C函数实现,并通过NDK编译成SO库,先定义一个新类
loadLibrary指定所要调用的so库,native表示so库的调用函数。package com.example.testing.mybooo; public class NdkJniUtils{ static { System.loadLibrary("demo"); } public native String getCLanguageString(); }
然后在app目录下创建JNI目录,用以存放源C文件和MakeFile文件
首先cmd进入./app目录下,使用javah指令根据制定类生成需求的H文件,指令:javah com.example.testing.mybooo.NdkJniUtils
根据生成的h文件定义的函数名来写对应的C函数实现;
demo.c如下
#include <jni.h> jstring Java_com_example_testing_mybooo_NdkJniUtils_getCLanguageString(JNIEnv *env, jobject obj) { return (*env)->NewStringUTF(env,"This just a test for Android Studio NDK JNI developer!"); }
写好C以后写MakeFile,必须命名为Android.mk,内容如下
LOCAL_PATH := $(call my-dir) //索引编译目录 include $(CLEAR_VARS) // LOCAL_MODULE := demo //输出模块名,实际输出so文件名为“libdemo.so” LOCAL_SRC_FILES := demo.c //源 include $(BUILD_SHARED_LIBRARY) //
之后在app目录下输入ndk-build命令,输出libdemo.so库文件。
在app节点的build.gradle的android分支下设置jni中的so来源
android { ... sourceSets { main { jniLibs.srcDirs = ['libs'] } } }
然后在MainActivity中调用所需函数,即可正常使用了。