android studio jni mac,JNI 开发详细初体验 (Mac Android Studio 3.1+)

前言:第一次写JNI,因为搜索到的教程不少都比较旧,有些配置在新版的Android Studio 3.1+ 有点变化,所以,这里写一篇用截止2018年9月开学季最新版的Android Studio 3.1+ 版本的JNI入门教程。java

一、配置环境变量android

在 .bash_profile 配置文件增长如下配置:bash

export PATH=${PATH}:/Users/hebin.yang/Library/Android/sdk/ndk-bundle函数

注:以上的 ndk 路径可直接在 Android Studio -- Open module setting 打开 Module 设置页面,复制 ndk 安装路径,如图:测试

c66cec52368de7b0f342070c73347cf6.png

而后输入如下命令使修改生效:gradle

source .bash_profileui

若是报 command not found, 须要在配置文件里增长如下配置(该配置和本文的 ndk 开发无关,这是使用Mac命令行所需的配置)spa

export PATH="/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin"命令行

到此,配置结束。能够在终端输入 ndk-build 验证一下配置是否成功,若是成功,显示以下图:3d

8646128e7bdb893479f4dbc28a406243.png

二、JNI 文件编写

(1)、 建立JAVA源文件,编写 native 方法

package com.ben.ndk.jni;

public class Encrypt {

public static native String encrypt(String source);

}

复制代码

(2)、 经过 javah 命令生成 .h 文件

首先得cd 进入当前module 的 java 路径:cd ndklib/src/main/java

javah -d ../jni com.ben.ndk.jni.Encrypt

d9a30ab0f2f77cf6ca96b866c31fedd3.png

生成.h文件如图所示(jni 路径也是自动生成的)

e559ca058fe6e3c731861b539296a928.png

这个自动生成的 .h 文件内容以下图所示:

ecc22f831d61b27301b46f6f8df89ec0.png

其中红圈里的方法和JAVA 文件里写的 native 方法相对应,下一步须要用到。

(3)、 建立 .c 文件

直接复制黏贴一份 .h 文件副本,后缀改成 .c 便可(将.c 内容清空),以下图所示:

36760a481ed804ce9e2fe1b0bd43de0d.png

在 .c 文件中实现c函数:导包,并将 .h 文件里圈圈的代码复制黏贴进来,记得增长一下参数名JNIEnv * enc, jclass cls, jstring inputStr,.c 文件的所有代码以下:

#include "com_ben_ndk_jni_Encrypt.h"

JNIEXPORT jstring JNICALL Java_com_ben_ndk_jni_Encrypt_encrypt

(JNIEnv * enc, jclass cls, jstring inputStr) {

return inputStr; //For 演示,此处忽略具体逻辑,直接返回输入的字符串

}

复制代码

(4)、 在jni目录下建立 Android.mk 文件

写入如下配置:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := NDKTest

LOCAL_SRC_FILES := com_ben_ndk_jni_Encrypt.c

include $(BUILD_SHARED_LIBRARY)

复制代码

注:其中须要改动的有两点

a. LOCAL_MODULE := NDKTest 这里的 NDKTest 本身命名,这是将要生成的 .so库的名字,会自动加上 lib前缀,最终生成库文件:libNDKTest.so

引用该库的代码:System.loadLibrary("NDKTest");//这里用到的就是 NDKTest

b. LOCAL_SRC_FILES := com_ben_ndk_jni_Encrypt.c 这里也要替换为你本身的 .c 文件名。

(5)、 在jni目录下建立 Application.mk 文件

写入如下配置:

APP_ABI := all

这个配置会生成全部主流 ABI 类型的 .so 库。

至此,全部 ndk 相关的文件建立完毕,以下图所示:

8cac0380f0a3e74f55f62e466df42876.png

(6)、 在当前 Module 下的 build.gradle 文件配置

a. 在 defaultConfig{} 下增长如下配置:

ndk {

moduleName "NDKTest" //System.loadLibrary("NDKTest");

}

复制代码

b. 备注一下

不少教程比较旧,都说须要在 gradle.properties 文件里加上下面的配置:

android.useDeprecatedNdk=true

以上配置在Android Studio 3 以后就废弃了(不须要加上)。

(7)、 最后一步

a. 在终端cd 进入前面生成的jni路径 cd ndkhelloworld/src/main/jni,即咱们上面写的 c 源文件的目录

b. 输入如下命令,生成 .so 库:

ndk-build

若是成功,打印如图所示:

0c4067f88eb7ab58dd188f349b585a35.png

同时,生成的 .so 库以下图所示(生成会稍微延迟一下,1分钟内):

3f165de33574a935a7777265ade21a18.png

备注:会同时生成 libs 和 obj 两个带有 .so 库的目录,只须要保存 libs 目录便可。

三、调用 .so 库

这里为了更详细的演示,咱们直接建立一个新module来演示 .so 库的调用。

(1)、 建立jniLibs 目录,复制以上生成的整个 libs 目录下的.so文件到该目录下,如图:

9db6c18f5f57b782f39cf018468a710a.png

(2)、 在 java 源文件下建立一个和上一步骤写的 Encrypt native 方法类所在包名 一致的包名和 java 文件,如图:

10279a7aef7f5d8466d3a02071059cce.png

注意:这个路径必须一致,不然报错,编译器是根据这个路径去调用 .so 库的 c 代码。

在建立的 Encrypt.java 中,加载 .so 库,代码以下:

package com.ben.nkd.jni; //包名要和建立 .so 库所写的Encrypt.java 类所在包名一致。

//类名也要一致

public class Encrypt {

static {

System.loadLibrary("NDKTest");

}

public static native String encrypt(String source); //这个方法和建立 .so 库所写的 native 代码一致。

}

复制代码

(3)、 测试

1b54f07d14757225230e8991a82ce26d.png

结果如图:

e94a4ebf2b49837df911e0b8e365a3ea.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值