博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【JNI开发】之从零开始
阅读量:6928 次
发布时间:2019-06-27

本文共 2990 字,大约阅读时间需要 9 分钟。

本文开发工具基于 Android Studio 3.0.1

1. Android Studio  NDK配置

NDK 下载(配置)如下图所示:

Android Studio 中 NDK 配置

下载(配置)完成后在SDK目录下会有如下 ndk-bundle 文件夹,如下图:

NDK 配置完成后在 SDK 目录下会有 ndk-bundle 文件夹

2. JAVA及NDK环境变量配置

JAVA 环境变量配置:

新建 JAVA_HOME 环境变量,并配置: C:\Program Files\Java\jdk1.8.0_31

配置 Path 环境变量:%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin

配置 CLASSPATH 环境变量:.;%JAVA_HOME%\lib (或更加精确的配置 .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar

检查 JAVA 环境变量是否配置成功,在命令行输入 java -version ,出现如下表示配置成功。

JAVA 环境变量配置成功

NDK环境变量配置:

在系统环境变量 Path 下增加 ndk-bundle 路径:G:\sdk\sdk\ndk-bundle

NDK 环境变量配置

检验 NDK 是否配置成功。在命令行输入 ndk-build 命令,出现如下表示配置成功。

NDK 环境变量配置成功

3. 新建项目(New Project)并配置项目

在 Android Studio 中新建一个项目 JNITest1

新建一个项目

1. 检查(配置) project 中的 local.properties ,是否有(添加):ndk.dir=G\:\\sdk\\sdk\\ndk-bundle  (新建项目会默认添加)

local.properties 配置

2. 配置 project 中的 gradle.properties,添加:android.useDeprecatedNdk=true

gradle.properties 配置

3. 配置 app 中的 build.gradle,在 defaultConfig 中添加:

ndk {

        moduleName "jnitest1"

}

moduleName 为最后生成的 *.so 文件名,最后会生成 libjnitest1.so 文件(增加了 lib 前缀)

build.gradle 配置

4. 新建 Java 与 C 交互的Java接口类(如:TestJniInterface.java)

创建一个 TestJniInterface.java 类并定义一个方法 getJniName()

新建接口类并定义方法

5. 根据Java接口类生成头文件(*.h 文件)

在命令行定位到 TestJniInterface.java 所在的 java 文件夹路径 : F:\AndroidStudioProject\JNITest1\app\src\main\java

执行命令 javah com.ljstudio.android.jnitest1.TestJniInterface

javah 执行命令

执行完成后会在所在的 java 文件夹生成 .h 的头文件 com_ljstudio_android_jnitest1_TestJniInterface.h

(JNI 取名规则为包名 + 类名,JNI 方法会在前面加上了 Java_ ,包名和类名用 _ 分割)

生成头文件

6. 编写C/C++源文件(*.cpp 文件)

1. 在 main 目录下新建一个 jni 文件夹,并把刚刚生成的头文件 com_ljstudio_android_jnitest1_TestJniInterface.h 移动到 jni 文件夹下。

2. 在 jni 文件夹下创建 C/C++ 源文件 com_ljstudio_android_jnitest1_TestJniInterface.cpp 并编写代码 。

#include "com_ljstudio_android_jnitest1_TestJniInterface.h"

JNIEXPORT jstring JNICALL Java_com_ljstudio_android_jnitest1_TestJniInterface_getJniName

(JNIEnv *env, jclass) {

        return env -> NewStringUTF("Say hello from JNI!");

}

(Java 的 String 类型 转换成了 C/C++ 中的 jstring,并用到 jni 中的 NewStringUTF 方法。)

新建源文件
编写源文件

7. 打包成  *.so 文件

1. 在 jni 目录下新建 Android.mk 文件并编写 *.so 的生成规格

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := jnitest1

LOCAL_SRC_FILES := com_ljstudio_android_jnitest1_TestJniInterface.cpp

include $(BUILD_SHARED_LIBRARY)

Android.mk 文件

默认生成所有平台下的 *.so 文件。

也可在指定相应平台,jni 文件夹下新建 Application.mk 文件编写规则:

APP_STL := gnustl_static

APP_CPPFLAGS := -frtti -fexceptions -std=c++0x

APP_ABI := armeabi-v7a

APP_PLATFORM := android-21

2. 在命令行定位到 jni 目录 ,并执行 ndk-build 命令,执行成功如下图。

ndk-build

3. 在 Android Studio 工程目录下会生成 libs 及 obj 二个文件夹

ndk-build 执行成功

至此 *.so 文件生成成功,我们可以在 Android 项目中开心的用起来了。

8. Android 项目中使用 *.so 文件

1. 在 TestJniInterface.java 中添加

static {

        System.loadLibrary("jnitest1");

}

接口文件加载 so 文件

2. 在 app 的 build.gradle 的 defaultConfig 中添加

sourceSets.main {

        jniLibs.srcDir'src/main/libs'

        jni.srcDirs = []

}

设置加载 so 文件路径

3. MainActivity中调用并运行,运行成功如下图

MainActivity 中调用

运行结果

欢迎指正及赞赏!

简书:

掘金:

CSDN:我的CSDN(待完善)

知乎:我的知乎(待完善)

GitHub:我的GitHub(待完善)

转载于:https://juejin.im/post/5ab0afd3f265da239706b086

你可能感兴趣的文章
基于Mesos的操作系统之RogerOS
查看>>
JS基础篇--事件绑定及深入
查看>>
Google 推出 Node 应用 Web 渲染界面 Carlo
查看>>
进一步成熟,Chrome OS 提供了更完整的 USB 支持
查看>>
Node.js ORM 框架 Sequelize 重要更新 v5 发布
查看>>
【meteor初体验-0.0.1】meteor简单开始
查看>>
Python 小试牛刀,Django详细解读,让你更快的掌握它!!! ...
查看>>
Selenium最全超时等待问题的处理方案
查看>>
微服务架构的中国式落地
查看>>
Git 实用指南
查看>>
大数据学习:带你从多个维度来分析大数据发展趋势 ...
查看>>
最小化 Java 镜像的常用技巧
查看>>
Swift 无限轮播图
查看>>
puppet连载四:服务端安装dashboard
查看>>
基于阿里云构建同城跨可用区的容灾解决方案
查看>>
二进制包20分钟快速安装部署 Kubernetes v1.14.0 集群 ...
查看>>
专访长亮科技李劲松:17年金融IT服务商的海外新机遇
查看>>
Linux基础命令---arping
查看>>
单季营收破千亿!中国首个!阿里要逆天
查看>>
会写代码是你创业路上的包袱吗?
查看>>