JNI学习笔记
来源:互联网 发布:万国数据是外企吗 编辑:程序博客网 时间:2024/06/05 02:09
JNI学习笔记
JNI允许java调用本地方法,这种能力真的是让人灰常灰常的激动呢。。下面就来看如何实现吧。
我想要调用c语言,编写一个函数,返回数组的和。
第一步:编写java代码
新建MMathTool.java
,代码如下:
public class MMathTool { private static String FILE_NAME=""; static{ System.load(FILE_NAME); } public native int sum(int nums[], int n); public static void main(String[] args){ int[] nums={1,2,3,4}; System.out.println(new MMathTool().sum(nums)); }}
第二步:编译java相关文件
-1.在命令行中将.java文件编译为.class文件
(要先切换到相应目录哦) javac MMathTool.java
-2.使用javah生成C语言头文件 javah -jni MMathTool
可以看到头文件内容如下:
/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class MMathTool */#ifndef _Included_MMathTool#define _Included_MMathTool#ifdef __cplusplusextern "C" {#endif/* * Class: MMathTool * Method: sum * Signature: ([II)I */JNIEXPORT jint JNICALL Java_MMathTool_sum (JNIEnv *, jobject, jintArray, jint);#ifdef __cplusplus}#endif#endif
-3.编写CPP文件
编写当中,注意在函数中加入形参
代码如下:
#include <jni.h>#include "MMathTool.h"JNIEXPORT jint JNICALL Java_MMathTool_sum (JNIEnv *env, jobject obj, jintArray nums) { int sum=0; jsize len=(*env)->GetArrayLength(env, nums); jint *a=(*env)->GetIntArrayElements(env, nums, 0); for(int i=0;i<len;i++) { sum+=a[i]; } (*env)->ReleaseIntArrayElements(env, nums, a, 0); return sum; }
-4.将编写的cpp文件编译为.dll文件
这个过程中有几点需要注意:
:编译器和JVM的位数要相同。比如说gcc编译器是64位,那么JVM也要是64位才可以运行。否则就会报错。
: 查看代码可以发现,引用了 jni.h
,jni_md.h
库,那么在编译的时候需要链接 gcc -shared -I "C:\Program Files\Java\jdk1.7.0_67\include" -I "C:\Program Files\Java\jdk1.7.0_67\include\win32" MMathTool.cpp -o libMMathTool.lib
编译出dll文件后,因为java程序中System.loadLibrary("libMMathTool")
,需要将其放到java相应的lib中。例如,可以放到C:\Program Files\Java\jdk1.7.0_67\lib
中。
- 5.运行.class java MMathTool
可以看到程序输出结果 6
Well done!
附上百度网盘链接http://pan.baidu.com/s/1sj03DE1
- jni学习笔记
- JNI学习笔记
- JNI入门学习笔记
- android JNI 学习笔记
- android JNI 学习笔记
- android jni 学习笔记
- android JNI 学习笔记
- Android JNI 学习笔记
- JNI学习笔记
- JNI学习笔记
- JNI 学习笔记
- JNI学习笔记一
- JNI学习笔记二
- JNI学习笔记三
- JNI学习笔记四
- JNI学习笔记五
- JNI学习笔记六
- JNI学习笔记
- dubbo使用详解
- error LNK2001: 无法解析的外部符号 解决办法
- 被误解的MVC和被神化的MVVM
- hadoop配置文件加载机制
- error while loading shared libraries的解決方法
- JNI学习笔记
- 机器学习是如何运作的?谷歌来告诉你
- hihocoder 1057 : Performance Log
- OpenGL ES 2.0总结(2)-纹理
- ViewPager引用错误的资源地址的图片导致的OOM问题
- mysql 中某一列字符串中特定字符以后的内容
- Oracle 11g中CTE应用示例
- 解决 anyconnect was net able to establish a connection to the specified secure gateway
- strcpy_s 与 strcpy 的用法