[Android NDK/JNI-1A]-开发环境搭建
NDK简介
NDK能干什么:NDK使得在android中,java可以调用C 函数库。
1.Android平台从诞生起,就已经支持C、C++开发。众所周知,Android的SDK基于Java实现,这意味着基于Android SDK进行开发的第三方应用都必须使用Java语言。但这并不等同于“第三方应用只能使用Java”。
2.在Android SDK首次发布时,Google就宣称其虚拟机Dalvik支持JNI编程方式,也就是第三方应用完全可以通过JNI调用自己的C动态库,即在Android平台上,“Java+C”的编程方式是一直都可以实现的。
3.NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk。这些工具对开发者的帮助是巨大的。
4.NDK集成了交叉编译器,并提供了相应的mk文件隔离CPU、平台、ABI等差异,开发人员只需要简单修改mk文件(指出“哪些文件需要编译”、“编译特性要求”等),就可以创建出so。
5.NDK可以自动地将so和Java应用一起打包,极大地减轻了开发人员的打包工作。
6.NDK提供了一份稳定、功能有限的API头文件声明
7.Google明确声明该API是稳定的,在后续所有版本中都稳定支持当前发布的API。从该版本的NDK中看出,这些API支持的功能非常有限,包含有:C标准库(libc)、标准数学库(libm)、压缩库(libz)、Log库(liblog)。
Today
1.NDK并不能显著提升应用效率。我们都觉得C语言比起java来说效率要高出很多,一方面,随着jdk的不断更新,java的效率也随之提高;另一方面,即便使用C语言编码提高了应用效率,但是在java与C相互调用时平白又增大了开销。
2.今天折腾了大半天,才编译出自己想要的so文件。但是android studio集成开发环境中还没尝试。
3.关于Cygwin下载问题,官方放在的step.exe国内今天根本没发弄下来,下载了一个老版本的exe,但是又不给更新。
http://www.redhat.com/services/custom/cygwin/ 在红帽试过,虽然exe能弄下来,但是Cygwin需要的下载的文件根本没法下载(网速太慢,比蜗牛还慢,况且有好几个G的)
http://mirrors.163.com/ 网易开源镜像站
http://www.cygwin.cn/site/info/show.php?IID=1003 Cygwin中文网
4.由于Java中的本地方法名称及包路径都是写死在C语言中的,因此本地相关代码不能混淆
5.项目中的JNI目录时编写c/c++的代码区,执行ndk-build命令后会在libs下生成so文件,在运行项目时,也是调用so文件中的相关资源。
为什么要使用NDK
java是半解释型语言,很容易被反汇编后拿到源代码文件,在开发一些重要协议时,我们为了安全起见,使用C语言来编写这些重要的部分,来增大系统的安全性。还有,在一些接近硬件环境下,相信大家都清楚C与java的优劣。
1.代码的保护。由于apk的java层代码很容易被反编译,而C/C++库反汇难度较大。
2.可以方便地使用现存的开源库。大部分现存的开源库都是用C/C++代码编写的。
3.提高程序的执行效率。将要求高性能的应用逻辑使用C开发,从而提高应用程序的执行效率。
4.便于移植。用C/C++写得库可以方便在其他的嵌入式平台上再次使用。
5.Eclipse中ndk配置

NDK开发所需要的环境
1.Android应用开发所需要的开发集成环境(环境变量自己百度)
2.NDK所需要的开发包(C:\java\android-ndk-r7b)
3.linux环境需要下载cygwin(C:\java\cygwin\bin)
4.配置各自的环境变量(JDK,SDK,NDK,cygwin)
JNI编码
1.新建一个android工程
2.在工程目录下添加名为 jni 的文件夹(必须)如下图:

3.在jni文件夹下新建你的.c和.h文件文件(JNI_Demo.c和JNI_Demo.h)

4.在jni文件夹下新建名字为Android.mk文件(文件名符合命名规则都行)
5.在上述.mk文件中加入如下代码:
LOCAL_PATH := $(call my-dir)//当前路径(如果你了解shell语言,应该可以很轻松的理解) include $(CLEAR_VARS) LOCAL_MODULE := JNI_Demo //要生成的.so库名
LOCAL_SRC_FILES := JNI_Demo.c //jni文件夹下的c文件名 include $(BUILD_SHARED_LIBRARY)
6.在JNI_Demo.c文件中加入如下代码:
#include <stdio.h>
#include "JNI_Demo.h" const char keyValue[] = {
119,119,119,46,104,111,109,105,108,121,46,99,110
}; JNIEXPORT jbyteArray JNICALL Java_com_homily_SecurityUtil_getKeyValue
(JNIEnv *env, jclass obj)
{
jbyteArray kvArray = (*env)->NewByteArray(env, sizeof(keyValue));
jbyte *bytes = (*env)->GetByteArrayElements(env,kvArray,0);
int i;
for (i = 0; i < sizeof(keyValue);i++)
{
bytes[i] = (jbyte)keyValue[i];
} (*env)->SetByteArrayRegion(env,kvArray, 0, sizeof(keyValue),bytes);
(*env)->ReleaseByteArrayElements(env,kvArray,bytes,0);
return kvArray;
}
7.在JNI_Demo.h文件中加入如下代码:
#include <jni.h> #ifndef _Included_com_homily_SecurityUtil
#define _Included_com_homily_SecurityUtil
#ifdef __cplusplus
extern "C" {
#endif
JNIEXPORT jbyteArray JNICALL Java_com_homily_SecurityUtil_getKeyValue
(JNIEnv *, jclass); #ifdef __cplusplus
}
#endif
#endif
8.然后就是写C对应的Java代码
Java_com_homily_SecurityUtil_getKeyValue
这个是Java类对应的路径,必须以Java开头,com.homily.SeturityUtil.java类下的getKeyValue方法。JNI桥接代码如下:
package com.homily;
public class SecurityUtil {
private static byte[] keyValue;
static {
System.loadLibrary("JNI_Demo");
keyValue = getKeyValue();
}
public static String getValue() {
return new String(keyValue);
}
public static native byte[] getKeyValue();
}
9.android调用代码如下
package com.homily;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log; public class MainActivity extends Activity { private static final String TAG = "MainActivity"; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
String enstr = SecurityUtil.getValue();
Log.d(TAG, "web address[" + enstr +"]");
} }
NDK编译结果
1.生成so文件
打开cmd,使用cd等相关命令进入该工程目录下 ,运行下面的命令,完成后点击右键刷新下项目,在libs下面就会生成so文件,如下:
E:\android_workspace\JNI_Demo>NDK-build
Android NDK: WARNING: APP_PLATFORM android-19 is larger than android:minS
[armeabi] Compile thumb : JNI_Demo <= JNI_Demo.c
[armeabi] SharedLibrary : libJNI_Demo.so
[armeabi] Install : libJNI_Demo.so => libs/armeabi/libJNI_Demo.so
so文件如下图:

2.最后运行下项目,输出日志如下:

参考资料:
http://mobile.51cto.com/aprogram-434525.htm
http://www.cnblogs.com/devinzhang/archive/2012/02/29/2373729.html
[Android NDK/JNI-1A]-开发环境搭建的更多相关文章
- Android发展演变与开发环境搭建
本人也算是一名比较会玩的Android手机用户,常常关注Android发展的最新情况,并且每年都会熬夜看谷歌的I/O大会,总会第一时间刷入最新的Android版本.接下来简单谈一下Android版本的 ...
- Linux下搭建Android NDK , Linux 驱动开发环境
Eclispe Luna(4.4):http://www.eclipse.org/downloads/ CDT :http://www.eclipse.org/cdt/downloads.php AD ...
- android Jni NDK开发环境搭建及其简单实例的编写
android Jni NDK开发环境搭建及其简单实例的编写 由于工作需要,需要采用开发想要的JNI,由于之前没有接触过安卓的开发,所以更加网上的帖子,学习了下.遇到了些问题,然后总结下学习过程中 ...
- android NDK开发环境搭建
android NDK开发环境搭建 2012-05-14 00:13:58 分类: 嵌入式 基于 Android NDK 的学习之旅-----环境搭建 工欲善其事必先利其器 , 下面介绍下 Eclip ...
- 【转】android 最新 NDK r8 在window下开发环境搭建 安装配置与使用 详细图文讲解,完整实际配置过程记录(原创)
原文网址:http://www.cnblogs.com/zdz8207/archive/2012/11/27/android-ndk-install.html android 最新 NDK r8 在w ...
- android 最新 NDK r8 在window下开发环境搭建 安装配置与使用 详细图文讲解,完整实际配置过程记录(原创)
android 最新 NDK r8 在window下开发环境搭建 安装配置与使用 详细图文讲解,完整实际配置过程记录(原创) 一直想搞NDK开发却一直给其他事情耽搁了,参考了些网上的资料今天终于把 ...
- android NDK 开发环境搭建
基于 Android NDK 的学习之旅-----环境搭建 工欲善其事必先利其器 , 下面介绍下 Eclipse SDK NDK Cygwin CDT 集成开发环境的搭建. 1.Android 开发环 ...
- Android NDK r8 Cygwin CDT 在window下开发环境搭建 安装配置与使用 具体图文解说
版权声明:本博客全部文章均为原创.欢迎交流.欢迎转载:转载请勿篡改内容,而且注明出处,谢谢! https://blog.csdn.net/waldmer/article/details/3272500 ...
- Android下NDK开发环境搭建
Android下NDK开发环境搭建 1. AndroidNDK安装与配置 1.1 NDK简介 Android NDK是一套允许开发人员使用本地代码(如C/C++)进行Android APP部 ...
- Cocos2dx-3.0版本 从开发环境搭建(Win32)到项目移植Android平台过程详解
作为重量级的跨平台开发的游戏引擎,Cocos2d-x在现今的手游开发领域占有重要地位.那么问题来了,作为Cocos2dx的学习者,它的可移植特性我们就需要掌握,要不然总觉得少一门技能.然而这个时候各种 ...
随机推荐
- 第五课,T语言转义字符()(版本5.0)
转义字符 字符串取值没什么限制,在引号""中可以填:数字.中文.字母 .特殊字符.以及他们的组合,字符串的值都要用双引号扩起来,比如 "我是字符型",当然,有人 ...
- nginx的HA集群及配置
一.服务器环境 master服务器: ip:192.168.11.155 系统环境:CentOS release 6.5 (Final) 内核版本:2.6.32-431.el6.x86_64 防火墙和 ...
- Java Web学习(1): 客户端请求、服务器响应及其HTTP状态码
一JSP客户端请求 当浏览器请求一个网页时,它会向网络服务器发送一系列不能被直接读取的信息,因为这些信息是作为HTTP信 息头的一部分来传送的.我们可以查阅HTTP协议来获得更多的信息. 下表列出了浏 ...
- Linux-以指定用户运行redis
redis中无配置启动用户信息,需要添加redis用户,后以其启动 useradd -s /bash/false -M redis >& &
- 套接字I/O模型-完成端口IOCP
“完成端口”模型是迄今为止最为复杂的一种I/O模型.然而,假若一个应用程序同时需要管理为数众多的套接字,那么采用这种模型,往往可以达到最佳的系统性能!但不幸的是,该模型只适用于Windows NT和W ...
- ABBYY FineReader 12双十一特价来袭
大家似乎都知道:好的办公软件,只要对自己有用,再贵都值得. 可偏偏有人不以为然,几百块钱也是肉啊.也对,毕竟不是人人都能做到"舍得".但没有舍,哪来的得呢? 作为优秀的光学字符识别 ...
- oracle监控脚本
简单命令 1.显示服务器上的可用实例:ps -ef | grep smon2.显示服务器上的可用监听器:ps -ef | grep -i listener | grep -v grep3.查看Orac ...
- wikioi1012 最大公约数和最小公倍数问题(2001年NOIP全国联赛普及组)
题目描述 Description 输入二个正整数x0,y0(2<=x0<100000,2<=y0<=1000000),求出满足下列条件的P,Q的个数 条件: 1.P,Q是正整 ...
- 导出多级表头表格到Excel
方法一:用NPOI定义多级表头导出: 引用头: using NPOI.DDF; using NPOI.OpenXmlFormats.Wordprocessing; using NPOI.HSSF.Us ...
- SQL集合运算参考及案例(一):列值分组累计求和
概述 目前企业应用系统使用的大多数据库都是关系型数据库,关系数据库依赖的理论就是针对集合运算的关系代数.关系代数是一种抽象的查询语言,是关系数据操纵语言的一种传统表达方式.不过我们在工作中发现,很多人 ...