JNI的环境配置与基础代码实现(AS)

/**
 * @author Hiushen
 * @date 2016/7/29
 */

JNI了解

Java Native Interface

定义

本地调用接口,可以说是为了对java层屏蔽具体的虚拟机实现上的差异,实现平台无关特行

作用

为java层与native层提供互调作用的桥梁
Java程序中的函数可以调用Native语言写的函数,Native一般指的是C/C++编写的函数
Native程序中的函数可以调用Java层的函数,也就是在C/C++程序中可以调用Java的函数
JNI作用图
java应用层需要调用一系列so库,而JNI正是为java层提供so库资源的调用接口,so库包括系统已有的、第三方的 或者我们自己自定义生成的so,所以jni层需要知道 比如系统调用等api,才可以封装出供java层调用的c/c++接口

google官网相关文章

jni Tips
The Native Development Kit (NDK)
ndk downloads

NDK 配置

我的软件版本

Android studio -> 2.1.2
jdk -> java version “1.8.0_73”

相关下载(ndk)

安装了ndk环境后才可以进行jni开发
1 可从上述官网下载zip文件,手动解压到sdk目录下
2 可直接在AS 的SDK Manager中直接下载
这里用第2种方式:
在线下载

下载解压后 需确认ndk路径是否配置好。【直接在AS上下载 一般会自动配置好】
检查ndk路径
or
这里写图片描述

gradle配置

1.配置root目录下的build.gradle【在classpath中添加experimental,把版本改为0.7.0】
这里写图片描述
2.配置app目录下的build.gradle
这里写图片描述

这里写图片描述

注:dependencies{} 应放在model{} 外进行声明

代码实现

借助javah来生成对应的头文件以及方法
1 新建类:

public class JniUtil {
    //modelName 需要和build.gradle声明的一样
    static {
        System.loadLibrary("jniTest");
    }
    //本地方法 Just for test
    public static native String getStringFromC();
    public static native String getStringByboolean(boolean flag);
}

2 新建类后 Clean project 或者 rebuild project,会build出classes目录,如图:
这里写图片描述
3 用系统的cmd或者AS下的Terminal,cd到app/build/intermediates/classes/all/debug/
命令 : javah -jni com.xs.ndkdemo.utils.JniUtil
最后在debug目录下生成com_xs_ndkdemo_utils_JniUtil.h头文件
4 在main目录内新建jni目录并把头文件copy进去 同时新建任意名字的c/c++文件 test.c:

#include "com_xs_ndkdemo_utils_JniUtil.h"

JNIEXPORT jstring JNICALL Java_com_xs_ndkdemo_utils_JniUtil_getStringFromC
  (JNIEnv *env, jobject obj) {
    return (*env) -> NewStringUTF(env,"this is getStringFromC method ");
  }

JNIEXPORT jstring JNICALL Java_com_xs_ndkdemo_utils_JniUtil_getStringByboolean
        (JNIEnv *env, jclass jclass1, jboolean jboolean1) {
    if (jboolean1) {
        return (*env)->NewStringUTF(env,"true");
    }
    return (*env)->NewStringUTF(env,"false");
}

【此处 函数名由包名+类名+方法名 组成】

Bug

Bug1 –> Error:Cause:org.gradle.api.internal.ExtensibleDynamicObject
Bug2 –> Error:No signature of method: org.gradle.model.ModelMap.getDefaultProguardFile() is applicable for argument types: (java.lang.String) values: [proguard-android.txt]

demo

https://github.com/Hiushen/NdkDemo.git

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值