Android开发中使用jni
分类:Android, Java, Java语言
阅读 (985)
Add comments
3月 202017
一、jni背景知识
jni是Java Native Interface的缩写,jni并不是Android开发的特性,而是在java的早期版本中就已经支持了,用于java层和Native层进行通讯的中间桥梁,大部分情况下使用c和c++进行编写,也可以使用其他的语言编写,只要满足约定的接口就可以。
二、Jni的副作用
Jni有以下副作用:
1、不再具有跨平台可移植性,如果移植到其他平台,需要开发Native层的相关代码
2、Native层的程序如果有问题将会导致java层的程序崩溃
三、开发步骤简述(Ubuntu 16 + openjdk-8-jdk)
1、在java代码中定义Native函数,比如java文件名为JniTest.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public class JniTest{ static { System.loadLibrary("jnitest"); } native int calc(int i1, int i2); public static void main(String args[]){ JniTest jnitest = new JniTest(); int sum = jnitest.calc(322, 21); System.out.print(sum); } } |
2、使用javac编译java文件,javac JniTest.java
3、使用javah工具传入java类名,生成native层的头文件,javah JniTest,此时目录下会有一个JniTest.h
4、新建一个JniTest.cc的文件,并添加如下内容:
1 2 3 4 5 6 |
#include "JniTest.h" JNIEXPORT jint JNICALL Java_JniTest_calc (JNIEnv *env, jobject obj, jint i1, jint i2){ return i1 + i2; }; |
5、将navtive层的代码编译成so库,命令如下:
1 2 |
gcc -I/usr/lib/jvm/java-8-openjdk-amd64/include/ -I/usr/lib/jvm/java-8-openjdk-amd64/include/linux -Wall -g -fPIC -c JniTest.cc -o jnitest.o gcc -shared jnitest.o -o libjnitest.so |
6、在java层使用System.loadLibrary(“jnitest”);加载动态库,并调用函数,见第1中的java代码
参考链接:
https://baike.baidu.com/item/JNI/9412164?fr=aladdin