Android studio 使用NDK工具实现JNI编程
前言:
Android开发中常常会使用到第三方的.so库。在使用.so库的时候就要用到JNI编程。JNI是Java Native Interface的缩写。它提供了若干的API实现了Java和其它语言的通信(主要是C&C++)。开发中一般都用第三方的库,非常多时候也可能我们自己来编写C或者C++来实现JNI编程,这篇博客主要是介绍Android studio 使用NDK工具来开发JNI编程。
环境配置
JNI编程须要满足例如以下前提:
- 你必须有安装Android studio开发idea编辑器(本人使用的是android studio 1.3版本号)。
- 下载最新版本号的NDK工具,然后解压到一个文件夹就可以(配置NDK环境变量时使用到该路径)。
我的ndk版本号为 android-ndk-r10e。
- 配置ndk环境变量,计算机–>属性–>高级系统设置–>环境变量–>系统变量–>新建 变量名:NDK_ROOT;变量值:F:\Android\SDK1\android2\android-ndk-r10e(此处是我的ndk路径。换成你自己的ndk路径就可以)。
- 当然前提是你要配置了jdk环境变量,配置如同第三点:变量名:JAVA_HOME;变量值:F:\Android\SDK1\android2\Java\jdk1.7.0_67(此处是我的jdk路径。换成你自己的jdk路径就可以)。
除此之外,你还得新建一个CLASSPATH环境变量,变量名:CLASSPATH;变量值为 .;%HOME_PATH%\lib; 一開始的 . 和;和最后的;都是须要的。
- 你还须要在gradle.progerties文件下加入例如以下代码
android.useDeprecatedNdk=true
假设没有gradle.progerties文件,请直接在当前project下新建该文件就可以。
JNI编程
1.新建JniUtils类。用来调用jni方法。代码例如以下:
package com.example.xjp.myjnidmoe;
public class JniUtils {
//载入静态库
static {
System.loadLibrary("Test");//此处载入的是对应的模块库,名称必须和 ndk的moduleName名一样。
}
//定义本地方法
public native String getValue();
}
2.Build 编译当前project,最后会在build文件夹下生成例如以下文件
该文件夹下生成了 JniUtils.class文件。
然后打开AS的Terminal终端,跳到debug文件夹下:
然后运行 javah -jni *(此处为你的目标文件路径。即JniUtils路径)
最后会在debug文件夹以下生成 com_example_xjp_myjnidmoe_JniUtils.h 头文件。代码例如以下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_xjp_myjnidmoe_JniUtils */
#ifndef _Included_com_example_xjp_myjnidmoe_JniUtils
#define _Included_com_example_xjp_myjnidmoe_JniUtils
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_example_xjp_myjnidmoe_JniUtils
* Method: getValue
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_example_xjp_myjnidmoe_JniUtils_getValue
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
以上代码是自己主动生成的,无需开发人员去改动。
3.在你的main文件夹下新建jni子文件夹。例如以下:
将刚才生成的 .h头文件拷贝到该jni文件夹下。然后新建一个 test.c文件,test.c文件代码例如以下:
//
// Created by 850302 on 2016/4/26.
//
#include "com_example_xjp_myjnidmoe_JniUtils.h"
JNIEXPORT jstring JNICALL Java_com_example_xjp_myjnidmoe_JniUtils_getValue
(JNIEnv *env, jobject obj) {
return (*env)->NewStringUTF(env, "This is my first JNI demo!");
}
因为jni编程对方法的名称有一定规则要求。开头须要Java_ 后面依次是jni方法的java类路径。以“_”切割。
开发人员为了不写错,能够直接将刚才的.h头文件中的方法 copy下来直接实现就可以。
4.配置Gradle文件
首先你得配置当前project的 build.gradle文件,事实上配置非常easy,直接在原来的build.gradle文件中加入 ndk的配置就可以。
apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion "22.0.1"
defaultConfig {
applicationId "com.example.xjp.myjnidmoe"
minSdkVersion 21
targetSdkVersion 23
versionCode 1
versionName "1.0"
//这里是配置ndk
ndk{
//定义库的模块名称。该名称用于System.loadLibrary("Test")
moduleName "Test"
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
}
是不是非常easy。不过定义了 ndk 的moduleName的名称而已。
其次是为当前project配置指定的ndk,配置方法例如以下:右键当前project名。选择Open Module Settings。弹出例如以下窗体。
如图。1:sdk路径;2:jdk路径。3:ndk路径;点击ok之后。
会在local.properties文件下配置指定的sdk和ndk路径:
#Tue Apr 26 18:36:18 CST 2016
ndk.dir=F\:\\Android\\SDK1\\android2\\android-ndk-r10e
sdk.dir=F\:\\Android\\SDK1\\android2\\sdk
如此,全部的准备工作都已经完毕。如今能够在你的代码中使用Test库了,调用代码例如以下:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView textView = (TextView) findViewById(R.id.text);
//start=====
JniUtils jniUtils = new JniUtils();
String content = jniUtils.getValue();
//end=====
textView.setText(content);
}
结果例如以下:
可能会有人问。代码生成的libTest.so库在哪里呢?事实上生成的libTest.so库已经打包到apk中去了,那么假如我要把这个so库给别人使用怎么办?非常easy,在你编译的过程事实上已经生成了libTest.so,在哪里呢?文件夹例如以下:bulid/intermediates/ndk文件夹下。该文件夹是编译成功之后生成的。
看到没?生成了不同平台下的libTest.so库。
总结
该博客主要是记录Android studio 下使用NDK工具实现JNI编程和生成so库的整个过程。以便开发人员了解JNI编程的一个完整的过程。
Android studio 使用NDK工具实现JNI编程的更多相关文章
- NDK工具开发Jni,Android studio jni开发
NDK工具开发JNI 对于JNI的作用,我这边就不详细说明了,百度google 有很多这样的介绍,这边着重详解AS使用NDK工具开发,调C的流程. 1,创建工程 2,创建native方法 //该类的路 ...
- 【Android Studio安装部署系列】二十五、Android studio使用NDK生成so文件和arr文件
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 Android Studio使用ndk的简单步骤. NDK环境搭建 下载NDK 下载链接:https://developer.and ...
- Android Studio 之 NDK篇
由于工作内容的关系,对于NDK的工作涉及比较广(保密性,安全性),所以本章内容讲述一下NDK的基本使用过程. 网上也有很多这样的教程或者描述,但描述的并不完全 开发工具:Android Studio ...
- Mac下Android studio 之NDK配置教程(一)
Mac下Android studio 之NDK配置教程(一) 1.概述 近期项目全线转移到Mac下使用使用Android studio开发. 遇到关键代码封装到 ***native***层,此时在wi ...
- JNI 在Android Studio利用NDK编译运行一个简单的c库
NDK开发,其实是为了项目需要调用底层的一些C/C++的一些东西:另外就是为了效率更加高些.如果你在Eclipse+ADT下开发过NDK就能体会到要么是配置NDK还要下载Cygwin,配置Cygwin ...
- android studio使用ndk,jni随记
1.下载ndk(会下载到sdk目录下) 2.配置 3.配置build.gradle(app) android { defaultConfig { ndk { moduleName "JniD ...
- Android Studio上NDK/JNI开发环境问题
基础环境: 操作系统 —— Windows 7 Android Studio —— 1.5.1(android-studio-bundle-141.2456560-windows.exe) NDK — ...
- 【android 开 发 】 - Android studio 下 NDK Jni 开发 简单例子
Android 开发了一段时间,一方面 ,感觉不留下点什么.有点对不起自己, 另一方面,好记性不如烂笔头,为了往后可以回头来看看,就当做是笔记,便决定开始写博客.废话不多说 ! 今天想搞一搞 ndk ...
- Android studio 下 NDK Jni 开发 简单例子
1. 创建一个新的工程 2. 创建一个新的类 JniText.java 点击Build--Make Project 后 选中工程 点击F4键 sdk location 中 Android ...
随机推荐
- c#逐行分元素读取记事本txt数据写进数据库
其实这里最关键的一个方法是 StreamReader类里的 ReadLine();这个方法可以逐行读取txt流里面的数据.写了个简单的demo,已经加上了详细的注释说明. ok,好了,不废话,下面 ...
- 编写和执行C#代码的插件:CS-Script for Notepad++
这个插件可以方便得让您在Notepad++编辑器中编辑和执行C#代码(脚本).它具备通用的C#智能感知和项目任务管理功能,方式非常类似于MS Visual Studio.除了这一点,它提供了通用的调试 ...
- cocos2dx游戏存储举例及其注意事项
今天白白跟大家分享一下cocos2dx中游戏的存储及需要注意的事项 cocos2dx中自带了存储类:CCUserDefault ,倘若需要存储的数据量教大的话,建议使用数据库来存储 现在先给大家看一下 ...
- XTU1236 Fraction
Fraction Accepted : 124 Submit : 806 Time Limit : 1000 MS Memory Limit : 65536 KB Fraction Problem D ...
- 如何使用Replace Pioneer批量查找和替换并提取指定字符串
1 我们查看源代码之后获得的网页文件如下图所示,一般都是href="/p-286018571.html"我们只要能提取到所有的"/p-XXXXXXXX.html" ...
- android 实现QQ好友列表
在某些Android开发群里,看到有些新手问怎么实现QQ好友列表,其实网上一搜挺多的.接触Android,也才一年的时间,大部分时间花在工作上(解bug...),界面上开发很少参与.自己维护的系统应用 ...
- vue diff算法 patch
1.diff比较算法 图示: diff比较只会在同层级进行, 不会跨层级比较. 所以diff是:广度优先算法. 时间复杂度:O(n) 代码示例: <!-- 之前 --> <div&g ...
- 解决 Maven was cached in the local repository, resolution will not be reattempted until the update interv
问题原因 Maven默认会使用本地缓存的库来编译工程,对于上次下载失败的库,maven会在~/.m2/repository/<group>/<artifact>/<ver ...
- java 将Map拷贝到另一个Map对象当中
java 将Map拷贝到另一个Map对象当中 CreateTime--2018年6月4日09点46分 Author:Marydon 1.需求说明 将一个MapA对象中所有的键值对完全拷贝到另一个M ...
- 网路总结01-HTTP协议和NSURLConnection