当你的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音频播放器。