1.下载NDK文件 我下的android-ndk-r13b-windows-x86_64.zip,解压,配置环境变量 (图片网上截取的,仅供参考)
cmd下测试ndk是否按照成功,如果成功如下所示:
(图片网上截取的,仅供参考)
Android studio工具里ndk相关配置
ndk从此处下载ndk解压过程中总是出错,所以采用的是上面的方法,直接网上下载。如果使用CMake开发NDK,此处下载CMake和LLDB
CMake和传统JNI两种开发NDK的方法
apply点击下载,需要一会时间
2.开始写相关代码了………
先看工程结构(里面包含有生成的libs和obj文件夹,自己不需要创建),创建jni文件夹
public class MainActivity extends Activity { TextView tv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tv = (TextView) findViewById(R.id.tv); MyJNI myJNI = new MyJNI(); tv.setText(myJNI.sayHello()); } }JNI类 添加native接口注意写好native接口和System.loadLibrary()
public class MyJNI { static { System.loadLibrary("JniTest");//库名和gradle里面一致 } public static native String sayHello(); }local.properties文件配置如下:
ndk.dir=D\:\\ndk\\android-ndk-r13b sdk.dir=D\:\\sdkgradle.properties文件里添加如下:
Android.useDeprecatedNdk=truebuild.gradle文件里面如下
android { compileSdkVersion 23 buildToolsVersion "25.0.0" defaultConfig { //添加 ndk { moduleName "JniTest" //库名字 //ldLibs "log", "z", "m" abiFilters "armeabi", "armeabi-v7a", "x86" } } //添加 sourceSets { main { jniLibs.srcDirs = ['libs'] } } }注意:此时jni文件夹下是空的
AS –>Build–>Make Project, 在app\build\intermediates\classes\debug\com\example\t400\test文件夹下会生成相应的.class文件
javah生成.h文件 点击”View->Tool Windows->Terminal“,打开终端
xxxxx\app>cd build\intermediates\classes\debug然后执行如下javah命令生成h文件
xxxxx\debug>javah -jni com.example.t400.test.MyJNI执行完之后你可以在文件夹\app\build\intermediates\classes\debug下看见生成的 .h头文件为:
com.example.t400.test.MyJNI.h其内容为:
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class com_example_t400_test_MyJNI */ #ifndef _Included_com_example_t400_test_MyJNI #define _Included_com_example_t400_test_MyJNI #ifdef __cplusplus extern "C" { #endif /* * Class: com_example_t400_test_MyJNI * Method: sayHello * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL java_com_example_t400_test_MyJNI_sayHello (JNIEnv *, jclass); #ifdef __cplusplus } #endif #endif将 .h文件剪切,粘贴到上面创建的空jni文件夹里,在jni目录下新建一个c文件,随意取名为jnitest.c ,然后编辑其代码如下:
#include "jni.h" #include "com_example_t400_test_MyJNI.h" JNIEXPORT jstring JNICALL Java_com_example_t400_test_MyJNI_sayHello (JNIEnv *env, jobject obj){ return (*env)->NewStringUTF(env,"this is test data!"); }注:jnitest.c同目录下记得创建空的util.c文件,util.c文件是避免某bug忘记了,请搜索。
3.收尾工作 创建Android.mk和Application.mk文件
Android.mk在目录jni下,Android.mk文件如下:
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := JniTest LOCAL_SRC_FILES := jnitest.c LOCAL_SRC_FILES += util.c include $(BUILD_SHARED_LIBRARY)其中LOCAL_PATH是C/C++代码所在目录,也就是我们的jni目录。 LOCAL_MODULE是要编译的库的名称。编译器会自动在前面加上lib,在后面加上.so。 LOCAL_SRC_FILES是要编译的C/C++文件。
Application.mk在最外层与local.properties同目级,Application.mk文件如下:
APP_PROJECT_PATH := $(call my-dir) APP_MODULES := JniTest执行ndk-build命令生成所有cpu架构的so库
切换到jni目录执行 jni> ndk-build如下:
看此刻的工程,图如下:
Android studio so 文件生成完毕!
注:上面的Make Project 也可以用Javac 命令把.class生成到相应的位置,然后在javah改路径
写在最后
so文件生成后的使用
在以上内容的基础上: 删除所有的 .mk 文件 删除所有的 .c 和 .h 文件 删除生成的obj文件夹和里面的所有文件 将生成的libs文件夹里的文件,拷贝到最外层的libs文件夹里,完成后删除该libs文件夹和里面的所有文件 至此一切OK!