Android studio 使用ndk开发JNI

今天写JNI Demo搞了一天,其中遇到了许多错误,不过一一解决了,下面是我根据网上总结的开发过程:

0.配置ndk路径

在project项目的local.properties里面加上ndk路径

ndk.dir=D\:\\NDK\\android-ndk-r11b


1.在project 下的gradle.properties,里面加上:

android.useDeprecatedNdk=true

Android studio 使用ndk开发JNI_第1张图片

2.在app 的build.gradle的

defaultConfig里面加入
 
  
ndk {
    moduleName "JniTest"
    ldLibs "log", "z", "m"
    abiFilters "armeabi", "armeabi-v7a", "x86"
}

moduleName 就是so库的库名。第二行打印log,第三行是支持的体系架构,完整如下

Android studio 使用ndk开发JNI_第2张图片

3.我们写本地方法(可以单独创建类,也可以直接在已有的类里面写),

Android studio 使用ndk开发JNI_第3张图片


4.调用本地方法,然后build项目(我此处,点击button,改变textview的文本),你会在 项目名\app\build\intermediates\classes\debug\(项目包名) 下找到生成的class文件

Android studio 使用ndk开发JNI_第4张图片


5.最重要的一步:打开as 的terminal,进入 项目名\app的main目录下,输入:

javah -d jni -classpath ;   education.bbk.com.myapplication.TestJJ

我的是:


此时你会发下生成了.h文件

Android studio 使用ndk开发JNI_第5张图片


6.创建main.c文件(文件命任意),打开.h文件,我们复制方法名过来,写好的如下,我们再次build

Android studio 使用ndk开发JNI_第6张图片

* DO NOT EDIT THIS FILE - it is machine generated */
#include 
#include 

#ifndef LOG_TAG
#define LOG_TAG "ANDROID_LAB"
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)
#endif

/* Header for class lab_sodino_jnitest_MainActivity */

#ifndef _Included_lab_sodino_jnitest_MainActivity
#define _Included_lab_sodino_jnitest_MainActivity
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class: lab_sodino_jnitest_MainActivity
 * Method: getStringFromNative
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_education_bbk_com_myapplication_TestJJ_getString
  (JNIEnv * env, jobject jObj){
      LOGE("log string from ndk.");
      return (*env)->NewStringUTF(env,"Hello From JNI!");
  }

#ifdef __cplusplus
}
#endif
#endif

7.buid后,我们发现已经生成了so包,然后在代码中加载库:

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

Android studio 使用ndk开发JNI_第7张图片

  Android studio 使用ndk开发JNI_第8张图片

8.运行项目,点击按钮,c代码成功调用

Android studio 使用ndk开发JNI_第9张图片 Android studio 使用ndk开发JNI_第10张图片


9.大家有什么疑问,欢迎讨论


你可能感兴趣的:(android,jni,android进阶之路)