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”{
}
由于在JAVA和C++中存在重载这个东西,但是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