美文网首页Android开发Android技术知识Android开发经验谈
小试牛刀--Android studio 使用ndk开发JNI

小试牛刀--Android studio 使用ndk开发JNI

作者: DDDDLU | 来源:发表于2018-06-05 10:08 被阅读49次

0.配置ndk路径

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

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

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

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

2.在app 的build.gradle的

defaultConfig里面加入

ndk {
    moduleName "JniTest"
    ldLibs "log", "z", "m"
    abiFilters "armeabi", "armeabi-v7a", "x86"
}

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

image

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

image

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

image

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

javah -d jni -classpath <SDK_android.jar>;<APP_classes> education.bbk.com.myapplication.TestJJ

我的是:

image

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

image

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

image
* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
#include <android/log.h>

#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");
}
image image

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

image image

9.笔记记得有点久,大家有什么疑问,欢迎讨论

相关文章

网友评论

本文标题:小试牛刀--Android studio 使用ndk开发JNI

本文链接:https://www.haomeiwen.com/subject/avqpsftx.html