JNI与NDK简介
最近稍微了解一下JNI和NDK. 网上各种教程给人一种二者不分的感觉, 经过自己运行代码, 将两者的关系理了一下.
就目前了解,JNI应该是java自带的一种调用c和c++等语言(native code)的一个机制.而NDK指的是android-ndk,一种在安卓上使用native code的工具.也就是说,在通常的JVM上,我们用的是JNI,而在android上,则首选NDK(因为也可以使JNI,但是比较麻烦,后面将提及).
一.首先说JNI.
新建一个普通的Java Application.
1.首先我们需要一个java类,用来调用native code(尽管此时native code 还没有生成),设文件名为Nadd.java,内容如下:
package com.hello.jnitest;
public class Nadd{
static{
System.loadLibrary("Nadd");
}
}
2.生成.h文件.在1之后,工程的bin目录下应该有会有如下的目录及文件com/hello/jnitest/Nadd.class.进入命令行,cd 到bin文件夹,输入如下命令:
javah com.hello.jnitest.Nadd
以上命令会在当前目录(bin)下生成com_hello_jnitest_Nadd.h文件.
3.编写.c文件.需要自己新建com_hello_jintest_Nadd.c文件.内容如下:
#include <</span>stdlib.h>
#include "com_hello_jnitest_Nadd.h"
JNIEXPORT jint JNICALL Java_com_hello_jnitest_Nadd_nadd(
JNIEnv * env,
jobject c,
jint a,
jint b) {
return (a+b);
}
4.生成.so文件.cd到.h和.c文件所在的目录(通过上面步骤应该是bin文件夹),输入命令:
gcc -I /.../jdk1.7.0_07/include/ -I /.../jdk1.7.0_07/include/linux/ -shared -fpic com_example_testjni_Nadd.c -o libadd.so
上面的...根据个人实际情况而定,反正就是要找到jdk的路径.
5.在工程目录下新建一个lib文件夹,把libadd.so放到里面.然后右键工程->Properties->Java Build Path,找到Source,展开Source folders on build path里面的工程,编辑Native library location,把location path设为刚才的lib文件夹.
6.与native code相关的工作就做完了,其它部分可以如同普通工程一样.比如新建一个Nadd类的对象,使用其函数等.
二.其次是NDK.
ndk其实更简单.
1.也需要一个java类,参考上面JNI中的1.
1.Android.mk文件和.c文件.新建一个android application.然后在工程根目录下新建一个jni文件夹,里面新建一个Android.mk文件,一个.c文件.Android.mk文件可以参考ndk自带的sample/hello-jni里面的.关键是LOCAL_MODULE和LOCAL_SRC_FILES要写对.c文件里面的函数名有一定的格式,要与1中的java类的包名和类名对应,写法可以参考上面的com_hello_jintest_Nadd.c,但是我们不需要.h文件.这个有待进一步研究.
2.终端cd到工程目录下,输入ndk-build.如果Android.mk和.c文件都对,会生成一个obj目录,在libs下目录下也会生成armeabi目录和其底下的*so文件.
3.其余部分就同其它android程序一样了.
4.补充:网上说可以通过一中JNI的方法生成*so文件,然后自己建libs/armeabi并把*so文件放进去,没有试过,我想应该可以.还有说把*so文件,用adb push 到什么地方,也可以吧.但是我感觉使用NDK,建mk文件和.c文件更简单一点,所需要的目录树都建好了,不必自己操心.
JNI与NDK简介的更多相关文章
- android gradle NDK简介
本章介绍在Android开发中,关于NDK,gradle相关的知识点. 1.NDK简介 (1)NDK是一系列工具的集合 NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将s ...
- Android JNI 和 NDK
1.Android NDK 一.NDK产生的背景 Android平台从诞生起,就已经支持C.C++开发.众所周知,Android的SDK基于Java实现,这意味着基于Android SDK进行开发的第 ...
- JNI和NDK
作者:十岁的小男孩 QQ:929994365 心之安处即是吾乡 前言 本文试图通过解答以下三个问题来达到学习JNI和NDK的目的.是什么?有什么用?怎么用?文章内容前三节来自下面第一个链接的博主共享, ...
- NDK简介
一.NDK简介: C/C++的动态库.Dalvik通过JNI编程方式调用C/C++代码. NDK编程提高软件性能,加密保护APK文件 ndk-build NDK编译生成脚本 Java编译 ...
- JNI和NDK编程
Java JNI的本意是Java Native Interface(Java本地接口),它是为了方便Java调用C.C++等本地代码所封装的一层接口.通过Java JNI,用户可以调用C.C++所编写 ...
- JNI和NDK的区别
http://blog.csdn.net/ithomer/article/details/6828830 NDK(Native Development Kit)“原生”也就是二进制 android常用 ...
- 【转】 Android 开发 之 JNI入门 - NDK从入门到精通
原文网址:http://blog.csdn.net/shulianghan/article/details/18964835 NDK项目源码地址 : -- 第一个JNI示例程序下载 : GitHub ...
- 【转】JNI和NDK的区别
原文网址:http://blog.csdn.net/ithomer/article/details/6828830 NDK(Native Development Kit)“原生”也就是二进制 andr ...
- 《Android开发艺术探索》读书笔记 (13) 第13章 综合技术、第14章 JNI和NDK编程、第15章 Android性能优化
第13章 综合技术 13.1 使用CrashHandler来获取应用的Crash信息 (1)应用发生Crash在所难免,但是如何采集crash信息以供后续开发处理这类问题呢?利用Thread类的set ...
随机推荐
- JAVA 判断一个字符串是不是一个合法的日期格式
原文:http://www.cnblogs.com/xdp-gacl/p/3548307.html 最近开发公司的项目,一直找不到合适的正则表达式可以判断一个字符串是否可以转成日期,今天发现可以采用S ...
- Linux命令(1) - 查看内存使用情况: free -hm
使用"free -hm"命令查看linux服务器的内存使用状况,其中-h表示人性化显示,-m表示将内存显示为M:
- Unix domain sockets
#server: SERVER_PATH = "/tmp/python_unix_socket_server" def run_unix_domain_socket_server( ...
- POJ水题 1298
#include "stdafx.h" #include <iostream> #include <string> using namespace std; ...
- Java跟Javac,package与import
今天讨论一下2个指令与2个关键字. 这次的没有IDE环境,直接在txt文本里编程,在cmd里编译运行,搞清楚java的文件结构,还有怎么设置编译器查找类的路径.首先是javac,有一个可带参数java ...
- 《C#开发微信门户及应用》
C#开发微信门户及应用(40)--使用微信JSAPI实现微信支付功能 C#开发微信门户及应用(39)--使用微信JSSDK实现签到的功能 C#开发微信门户及应用(38)--微信摇一摇红包功能 C#开发 ...
- Django开发博客- 三部曲
其实在django中实现一个功能只需要三个步骤即可,这里我姑且叫它三部曲. 这三部曲就是: 定义urls映射 定义views 定义templates 什么是URL? URL就算一个WEB地址,你在浏览 ...
- static与C#中的static
Static 1.静态方法与非静态方法 a.静态方法的调用类.静态方法名([参数列表]) 非静态方法的调用类 对象 = new 类的构造函数([参数列表])对象.非静态方法名([参数列表]) 静态方法 ...
- 匹配session
package dl.zhang.test.util; import java.io.IOException; import java.io.Reader; import org.apache.iba ...
- JAVA String作业——动手动脑以及课后实验性问题
一:如何解释这样的输出结果?从中你能总结出什么?1.源码 //mao2015.10.20 //==的两个分辨 //对原始数据而言 //对引用类型变量 public class StringPool { ...