JAVA的JNI实现基础

来源:互联网 发布:数据维度是什么意思 编辑:程序博客网 时间:2024/05/17 23:29

Jni学习总结

一,在java中的jni的编写方法

1.第一步,在JAVA中要做的工作

(1).创建一个JAVA的工程

(2).在工程里面创建一个Test的类

(3).在Test类里面加载动态库

(4).生成native方法

(5).创建主函数,调用jni实现的方法

代码如下:

package test;

publicclass Test {

/*用于加载动态库文件,动态链接库名字为libtest.so*/

static{

System.loadLibrary("test");

}

/*声明一个native的方法*/

publicnativevoid test();

publicstaticvoid main(String[] args){

/*调用Test类的test()方法*/

new Test().test();

System.out.println("Hello , it's my javav JNI .\n");

}

}

2.编译这个java文件,生成class文件

1)进入到工程中的java文件的目录下

2)编译java文件生成class文件

代码如下:

cd /root/Desktop/android_jni/java_jnitest/src/test

javac Test.java

3.使用javah这个工具生成test_Test.h的头文件

1)进入到工程文件的源码目录

2)执行javah工具生成.h文件

代码如下:

cd /root/ Desktop/android_jni/java_jnitest/src

javah -jni test.Test

test_Test.h文件的内容为如下

/* DO NOT EDIT THIS FILE - it is machine generated */

#include<jni.h>

/* Header for class test_Test */

#ifndef _Included_test_Test

#define _Included_test_Test

#ifdef __cplusplus

extern"C" {

#endif

/*

* Class: test_Test

* Method: test

* Signature: ()V

*/

JNIEXPORT void JNICALL Java_test_Test_test

(JNIEnv *, jobject);

#ifdef __cplusplus

}

#endif

#endif

当然这个.h文件我们也可以手写,但是必须的符合一些规则,首先解释一下这个.h文件吧,需要包含jni.h头文件,然后

#ifndef

#define

#endif

这个是防止重复的定义这段代码

还有个东东extern C{

}

由于在JAVAC++中存在重载这个东西,但是C语言不包含重载这个概念,就产生了这个东东,它主要是在函数的命名上来区分。所以这里如果是C语言的化,我们会开启这个东东,来给我们的jni函数按这样的规则命名。如果是C++则不用它会自动的转换为这种规则命名。

4.编写我们的C代码

1)包含需要的头文件

2)实现.h中的函数

#include<stdio.h>

#include <jni.h>

#include"../test_Test.h"

JNIEXPORT

void JNICALL Java_test_Test_test(JNIEnv *env, jobject jb)

{

printf("This is my java JNI test .\n");

}

5.生成动态链接库

1)进入包内

2)使用gcc生成动态链接库

代码如下:

cd /root/Desktop/android_jni/java_jnitest/src/test

gcc -I /usr/lib/jvm/java-6-openjdk/include/ -fPIC -shared -o libtest.so test.c

6.设置环境变量并运行测试

1)设置环境变量,在加载.so文件时会自动到该环境变量下查找(仅在当前shell有效)

2)记得回到源码目录(src目录下)

3)执行测试

代码如下:

export LD_LIBRARY_PATH=”/root/Desktop/android_jni/java_jnitest/src/test“

cd /root/Desktop/android_jni/java_jnitest/src

java test.Test