您的位置:首页 > 编程语言

JNI编程

2015-07-30 16:11 411 查看
当你的C语言的库想在Java程序里被调用的话,这就需要用到java的jni编程了。jni编程其实也没什么难的地方,无非是java封装好几个接口,用C语言去实现罢了。

到这,相信你应该把jdk准备好了吧,这里就不单独把jdk安装放进来了。

好!linux下目录/home/lide/work/test/下创建myjni

cd myjni/

创建MyJni.java

public class MyJni{
public native void display();
public native double sum(double x, double y);
public native int create_file();

static{
System.loadLibrary("sum");
}

public static void main(String[] args){
new MyJni().display();
new MyJni().create_file();
System.out.println(new MyJni().sum(2.0, 3.0));
}
}


执行javac MyJni.java 生成MyJni.class

这时候,我们准备好了java的函数接口,注意代码中的

static{
System.loadLibrary("sum");
}


这就是把libsum.so库加载进来的意思,这时候执行
javah -classpath /home/lide/work/test/myjni MyJni


javah命令是根据MyJni里声明native的函数生成Myjni.h文件,这就是C语言的函数接口,-classpath是设置class文件路径的意思,这时候设置为当前工程目录。MyJni.h内容如下:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class MyJni */

#ifndef _Included_MyJni
#define _Included_MyJni
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class:     MyJni
* Method:    display
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_MyJni_display
(JNIEnv *, jobject);

/*
* Class:     MyJni
* Method:    sum
* Signature: (DD)D
*/
JNIEXPORT jdouble JNICALL Java_MyJni_sum
(JNIEnv *, jobject, jdouble, jdouble);

/*
* Class:     MyJni
* Method:    create_file
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_MyJni_create_1file
(JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif


至此,我们的准备工作就做好了,需要C实现

JNIEXPORT void JNICALL Java_MyJni_display
(JNIEnv *, jobject);
JNIEXPORT jdouble JNICALL Java_MyJni_sum
(JNIEnv *, jobject, jdouble, jdouble);
JNIEXPORT jint JNICALL Java_MyJni_create_1file
(JNIEnv *, jobject);


这三个接口

编辑MyJni.c

#include <jni.h>
#include "MyJni.h"
#include <stdio.h>

JNIEXPORT void JNICALL Java_MyJni_display
(JNIEnv *evn, jobject obj)
{
printf("Hello Wrold!\n");
return;
}

JNIEXPORT jdouble JNICALL Java_MyJni_sum
(JNIEnv *evn, jobject obj, jdouble a, jdouble b)
{
return a + b;
}
JNIEXPORT jint JNICALL Java_MyJni_create_1file
(JNIEnv *evn, jobject obj)
{
char buf[256];
FILE* fp=fopen("./test", "wb+");
if(fp == NULL){
printf("open file error\n");
return 1;
}
sprintf(buf, "This is a test!");
//  fputs("This is a test!", fp);
fputs(buf, fp);
printf("read end!\n");
fclose(fp);
return 0;
}


gcc -Wall -shared -fPIC -o -g libsum.so MyJni.c -I/home/lide/work/package/jdk1.8.0_51/include -I/home/lide/work/package/jdk1.8.0_51/include/linux


ls

当前目录生成了
libsum.so


export LD_LIBRARY_PATH=/home/lide/work/test/myjni

java Myjni

程序正确执行,打印

Hello Wrold!
read end!
5.0


生成了test文件

这样看来jni编程没什么困难,接下来就可以在Android程序中愉快的调用我们的C程序库了,接下来一段时间可能尝试开发一个简单的android rtmp音频播放器。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java jni