HelloNative.java
class HelloNative{
public static native void greeting();
}
本地方法既可以是静态的也可以是非静态的
为了实现本地代码,需要编写一个相应的c函数,必须完全按照java虚拟机预期的那样来命名这个函数
规则:
1.使用完整的方法名,比如 HelloNative.greeting
2.如果类属于某一个包,那么在前面添加包名,比如 com.test.HelloNative.greeting
3.用下划线替换掉所有的 . 号,并且加上java_ 前缀 例如 :java_HelloNative_greeting java_com_test_HelloNative_greeting
4.如果类名含有非ASCII 的字母或数字 如:'_' , '$' 或是大于 ‘\u007F’的Unicode 的字符,用_0xxxx 来替代他们,xxxx 是该字符的Unicode值的4个十六进制数序列
5.如果你重载本地方法,也就是说,你用相同的名字提供多个本地方法,那么,必须在名称后附加两个下划线,后面再加上已编码的参数类型
例如: 有一个本地方法 greeting 和 另一个 greeting(int repeat) ,那么第一个称为 java_HelloNative_greeting__ 第二个称为 java_com_test_HelloNative_greeting__I
运行
运行javah 实用程序 ,他能自动生成函数名
javac HelloNative.java
javah HelloNative //这条命令会产生一个头文件
HelloNative.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloNative */
#ifndef _Included_HelloNative
#define _Included_HelloNative
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: HelloNative
* Method: greeting
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloNative_greeting
(JNIEnv *, jclass);
#ifdef __cplusplus
}
#endif
#endif
现在,需要将函数原型从头文件复制到源文件,并且给出函数的实现代码
HelloNative.c
#include "HelloNative.h"
#include <stdio.h>
JNIEXPORT void JNICALL Java_HelloNative_greeting(JNIEnv* env, jclass cl){
printf("Hello, Native World!\n");
}
将本地C代码编译到一个动态装载库中,具体方法依赖于编译器。
linux Gnu C 编译器
gcc -fPIC -I jdk/include -I jdk/include/linux -shared -o libHelloNative.so HelloNative.c
windows 下 微软编译器
cl -I jdk\include -I jdk\include\win32 -LD HelloNative.c -FehelloNative.dll
这里jdk是含有JDK的目录
最后,我们要在程序中添加一个对 System.loadLibrary 方法的调用。
HelloNativeTest.java
Class HelloNativeTest{
public static void main(String[] args){
HelloNative.greeting();
}
static{
System.loadLibrary("HelloNative");
}
}
实现步骤
1.在java类中生命一个本地方法
2.运行javah已获得包含该方法的c声明的头文件
3.用c实现该本地方法
4.用代码置于共享类库中
5.在java程序中加载该类库
java.lang.System 1.0
void loadLibrary(String libname)
装载类库的名字,该库位于库搜索路径中,定位的确切方法依赖于操作系统
class HelloNative{
public static native void greeting();
}
本地方法既可以是静态的也可以是非静态的
为了实现本地代码,需要编写一个相应的c函数,必须完全按照java虚拟机预期的那样来命名这个函数
规则:
1.使用完整的方法名,比如 HelloNative.greeting
2.如果类属于某一个包,那么在前面添加包名,比如 com.test.HelloNative.greeting
3.用下划线替换掉所有的 . 号,并且加上java_ 前缀 例如 :java_HelloNative_greeting java_com_test_HelloNative_greeting
4.如果类名含有非ASCII 的字母或数字 如:'_' , '$' 或是大于 ‘\u007F’的Unicode 的字符,用_0xxxx 来替代他们,xxxx 是该字符的Unicode值的4个十六进制数序列
5.如果你重载本地方法,也就是说,你用相同的名字提供多个本地方法,那么,必须在名称后附加两个下划线,后面再加上已编码的参数类型
例如: 有一个本地方法 greeting 和 另一个 greeting(int repeat) ,那么第一个称为 java_HelloNative_greeting__ 第二个称为 java_com_test_HelloNative_greeting__I
运行
运行javah 实用程序 ,他能自动生成函数名
javac HelloNative.java
javah HelloNative //这条命令会产生一个头文件
HelloNative.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloNative */
#ifndef _Included_HelloNative
#define _Included_HelloNative
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: HelloNative
* Method: greeting
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloNative_greeting
(JNIEnv *, jclass);
#ifdef __cplusplus
}
#endif
#endif
现在,需要将函数原型从头文件复制到源文件,并且给出函数的实现代码
HelloNative.c
#include "HelloNative.h"
#include <stdio.h>
JNIEXPORT void JNICALL Java_HelloNative_greeting(JNIEnv* env, jclass cl){
printf("Hello, Native World!\n");
}
将本地C代码编译到一个动态装载库中,具体方法依赖于编译器。
linux Gnu C 编译器
gcc -fPIC -I jdk/include -I jdk/include/linux -shared -o libHelloNative.so HelloNative.c
windows 下 微软编译器
cl -I jdk\include -I jdk\include\win32 -LD HelloNative.c -FehelloNative.dll
这里jdk是含有JDK的目录
最后,我们要在程序中添加一个对 System.loadLibrary 方法的调用。
HelloNativeTest.java
Class HelloNativeTest{
public static void main(String[] args){
HelloNative.greeting();
}
static{
System.loadLibrary("HelloNative");
}
}
实现步骤
1.在java类中生命一个本地方法
2.运行javah已获得包含该方法的c声明的头文件
3.用c实现该本地方法
4.用代码置于共享类库中
5.在java程序中加载该类库
java.lang.System 1.0
void loadLibrary(String libname)
装载类库的名字,该库位于库搜索路径中,定位的确切方法依赖于操作系统