JNI详细教程

来源:互联网 发布:学习软件大全下载 编辑:程序博客网 时间:2024/05/25 12:22

一、创建java文件

  首先创建需要调用jni的java文件。如:

package com.rg.serialPort;public class SerialPort {  ...  public SerialPort(File device, int baudRate, int flags)     throws SecurityException, IOException {    ...  }  public InputStream getInputStream() {    ...  }  public InputStream getOutputStream() {    ...    // JNI  private native static FileDescriptor open(String path, int baudrate, int flags);  public native void close();  static {    System.loadLibrary("serialPort");  }}

二、编辑生成class

进入src/ 目录,然后运行

javac com/cqb/hellojnitest/HelloJniTest.Java
可以看到在相应的目录下生成了 HelloJniTest.class
或直接在.java文件所在的目录底下 javac
cmd -> javac(编译StudentToJNI.Java文件) 生成字节码文件
实验没成功,可以直接借助IDE直接生成,eclipse在bin目录下,androidstudio在build/intermediates/classes/debug/下

三、使用javah生成头文件

cd至项目classess目录下 执行

javah -classpath bin/classes com.rg.serialPort.SerialPort
javah -classpath build/intermediates/classes/debug/com/rg/serialPort/ com.rg.serialPort.SerialPort

通过输入javah 可以看到以下结果:

用法:javah [选项] <类>其中 [选项] 包括:        -help                 输出此帮助消息并退出         -classpath <路径>     用于装入类的路径         -bootclasspath <路径> 用于装入引导类的路径         -d <目录>             输出目录         -o <文件>             输出文件(只能使用 -d 或 -o 中的一个)         -jni                  生成 JNI样式的头文件(默认)         -version              输出版本信息         -verbose              启用详细输出         -force                始终写入输出文件

这表明:-classpath是用来装入类的路径的,而前面我们已经进入了项的根路径目录,所以-classpath只要装载SerialPort.class类文件的bin\classes目录,-d用来指定输出路径,一般在项目根路径下面新建一个jni文件夹用来存储c文件,所以,-d后面输入jni,最后是报名+类名

四、JNI

  1. 项目根目录下新建jni文件夹,复制 .h文件至jni文件夹下,然后找到ndk的安装目录找到android.mk,Application.mk文件夹一同放在jni目录下,注意如果使用c++里的库需要在Application.mk文件中加入(APP_STL:= stlport_shared)
    至于两个文件内容其它的用法,这里就不在描述(goolgle)

  2. jni文件夹下新建.cpp文件,最好名称与头文件一致,然后拷贝头文件里的所有函数至cpp文件夹内,并且导入头文件(#include<name.h>),当然也要导入jni.h头文件,其实我们主要做的是就是通过jni把java传进来的类型,转换成c++需要的类型,然后把c++返回的值通过jni转换成java所需要的类型。jni.h头文件里提供了很多转换的方法以及取值的方法,具体大家可以打开ndk安装目录(platforms\android-9\arch-arm\usr\include)目录下查看jni.h头文件

0 0