JNI编程基础
2015-07-03 11:31
309 查看
JNI基础概念
Java Native Interface Java本地调用 主要是为了和C/C++交互
JNI的副作用
一旦使用JNI,JAVA程序就丧失了JAVA平台的两个优点:1、程序不再跨平台。要想跨平台,必须在不同的系统环境下重新编译本地语言部分。2、程序不再是绝对安全的,本地代码的不当使用可能导致整个程序崩溃。一个通用规则是,你应该让本地方法集中在少数几个类当中。这样就降低了JAVA和C之间的耦合性。
JNI操作函数
JNI异常如果出现java.lang.UnsatisfiedLinkError的异常,解决方法如下:1.java -Djava.library.path2.export LD_LIBRARY_PATH操作实例:1.编写 TestJni.java
[/code]2.编译 javac TestJin.java3.生成头文件 javah -jni TestJni4.重命名 mv TestJni.h MyJni.h5.添加修改代码 MyJni.h
/*
1.JNIEnv是JNI的核心数据,指向JNIEnv结构的指针
2.jobject的意义取决于该方法是否是静态还是实例方法。当本地方法作为一个实例方法时,第二个参数相当于对象本身,即this.当本地方法作为一个静态方法时,指向所在类。
3.jni.h文件必须被包含,该文件定义了JNI所有的函数声明和数据类型。
4.JNIEXPORT和JNICALL是可忽略的JNI关键字,其实是一些宏,想了解的可以找jni_md.h文件查看。我们目前使用的jni.h定义他们为空。
*/
[/code]
6.执行命令生成 libMyJni.so文件gcc -fPIC -shared -o libMyJni.so MyJni -I. -I/home/dir -I/%JAVA_HOME%
1)JNI java code 与 c/c++进行交互
2)JNI编程流程 a. 编写一个.java
b.javac *.java
c.javah -jni className -> *.h
d.在.c/.cpp文件实现这个native方法
e.创建一个.so/.dll
3)数据类型
char -> jchar boolean -> jboolean ...
4)出现java.lang.UnsatifiedLinkedError的异常
java -Djava.library.path
export LD_LIBRARY_PATH
5)注意事项
a.不要直接使用从Java里面传递过来的对象,基本数据类型,要用过环境指针转换 (*env) -> b.一旦不使用某个对象或变量,要去释放内存release c.不要在native code里面去申请内存JNI签名[/b]
可以通过javap -s 查看类的签名
JNI签名类型
来自为知笔记(Wiz)
Java Native Interface Java本地调用 主要是为了和C/C++交互
JNI的副作用
一旦使用JNI,JAVA程序就丧失了JAVA平台的两个优点:1、程序不再跨平台。要想跨平台,必须在不同的系统环境下重新编译本地语言部分。2、程序不再是绝对安全的,本地代码的不当使用可能导致整个程序崩溃。一个通用规则是,你应该让本地方法集中在少数几个类当中。这样就降低了JAVA和C之间的耦合性。
JNI操作函数
JNI异常如果出现java.lang.UnsatisfiedLinkError的异常,解决方法如下:1.java -Djava.library.path2.export LD_LIBRARY_PATH操作实例:1.编写 TestJni.java
public class TestJin{
//定义的一个native方法,并加载动态库
public native void print(String str);
static{
System.loadLibrary("MyJni");
}
public static void main(String[] args){
new TestJin().print("hello jni");
}
}
[/code]2.编译 javac TestJin.java3.生成头文件 javah -jni TestJni4.重命名 mv TestJni.h MyJni.h5.添加修改代码 MyJni.h
#include<MyJni.h>
#include<stdio.h>
/* Header for class TestJni*/
#ifndef _Included_TestJni
#define _Included_TestJni
#ifdef __cplusplus
extern "C"{
#endif
JNIEXPORT void JNICALL Java_TestJni_print
(JNIEnv *env, jobject obj, jstring str){
jchar *s =(jchar *)(*env) ->GetStringUTFChars(env,str,NULL);
printf("content is %s\n",(char *)s);
(*env)->ReleaseStringUTFChars(env,str,(const char*)s);
}
#ifdef __cplusplus
}
#endif
#endif
/*
1.JNIEnv是JNI的核心数据,指向JNIEnv结构的指针
2.jobject的意义取决于该方法是否是静态还是实例方法。当本地方法作为一个实例方法时,第二个参数相当于对象本身,即this.当本地方法作为一个静态方法时,指向所在类。
3.jni.h文件必须被包含,该文件定义了JNI所有的函数声明和数据类型。
4.JNIEXPORT和JNICALL是可忽略的JNI关键字,其实是一些宏,想了解的可以找jni_md.h文件查看。我们目前使用的jni.h定义他们为空。
*/
[/code]
6.执行命令生成 libMyJni.so文件gcc -fPIC -shared -o libMyJni.so MyJni -I. -I/home/dir -I/%JAVA_HOME%
1)JNI java code 与 c/c++进行交互
2)JNI编程流程 a. 编写一个.java
b.javac *.java
c.javah -jni className -> *.h
d.在.c/.cpp文件实现这个native方法
e.创建一个.so/.dll
3)数据类型
char -> jchar boolean -> jboolean ...
4)出现java.lang.UnsatifiedLinkedError的异常
java -Djava.library.path
export LD_LIBRARY_PATH
5)注意事项
a.不要直接使用从Java里面传递过来的对象,基本数据类型,要用过环境指针转换 (*env) -> b.一旦不使用某个对象或变量,要去释放内存release c.不要在native code里面去申请内存JNI签名[/b]
可以通过javap -s 查看类的签名
JNI签名类型
来自为知笔记(Wiz)
相关文章推荐
- Java大文本文件切割
- Win8.1的Matlab7卸载问题
- LeetCode172_FactorialTrailingZeroes java题解
- 【 C语言】将一个数字按字符形式逐个输出,例如1234,输出为1 2 3 4
- c#单例模式的简单介绍
- 《JAVA程序设计》第二次——《猜猜看》游戏
- 《java实习》日志 周五 添加了提示框
- Qt创建对话框的三种方法
- xml DTD的约束以及校验
- 写给系统管理员的25个PHP安全实践
- C#下载网页并在控制台输出的方法
- php5.6高版本开启curl
- Fail to create the java Virtual Machine
- python 获取当前函数名和行号
- Python中map()函数浅析
- 输出未知数目数字的和
- unbuntu 14.04 安装 QT 5.4.2
- JAVA集合学习
- java 转发和重定向的区别
- Berkeley's SICP in python(一)