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
执行javac MyJni.java 生成MyJni.class
这时候,我们准备好了java的函数接口,注意代码中的
这就是把libsum.so库加载进来的意思,这时候执行
javah命令是根据MyJni里声明native的函数生成Myjni.h文件,这就是C语言的函数接口,-classpath是设置class文件路径的意思,这时候设置为当前工程目录。MyJni.h内容如下:
至此,我们的准备工作就做好了,需要C实现
这三个接口
编辑MyJni.c
ls
当前目录生成了
export LD_LIBRARY_PATH=/home/lide/work/test/myjni
java Myjni
程序正确执行,打印
生成了test文件
这样看来jni编程没什么困难,接下来就可以在Android程序中愉快的调用我们的C程序库了,接下来一段时间可能尝试开发一个简单的android rtmp音频播放器。
到这,相信你应该把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对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- 插入排序
- 冒泡排序
- 堆排序