Java的native方法使用
2007-04-18 14:30
369 查看
转载地址:http://topic.csdn.net/t/20040812/18/3268919.html
有个问题是为什么例如"FileOutputStream"这些类里并没有以下的调用?
static {
System.loadLibrary("NativeDemo");
}
以下是一个例子:
// A simple example that uses a native method.
public class NativeDemo {
int i;
public static void main(String args[]) {
NativeDemo ob = new NativeDemo();
ob.i = 10;
System.out.println("This is ob.i before the native method:" +
ob.i);
ob.test(); // call a native method
System.out.println("This is ob.i after the native method:" +
ob.i);
}
// declare native method
public native void test() ;
// load DLL that contains static method
static {
System.loadLibrary("NativeDemo");
}
}
注意test( )方法声明为native且不含方法体。简而言之这是我们用C语言实现的方法。
写完程序后,编译它生成NativeDemo.class。然后,你必须用javah.exe生成一个文件:
NativeDemo.h(javah.exe包含在JDK中)。在执行test( )时你要包含NativeDemo.h。为生成
NativeDemo.h,用下面的命令:
javah -jni NativeDemo
该命令生成名为NativeDemo.h的头文件。该文件必须包含在实现test()的C文件中。该命
令的输出结果如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class NativeDemo */
#ifndef _Included_NativeDemo
#define _Included_NativeDemo
#ifdef _ _cplusplus
extern "C" {
#endif
/*
* Class: NativeDemo
* Method: test
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_NativeDemo_test
(JNIEnv *, jobject);
#ifdef _ _cplusplus
}
#endif
#endif
注意函数的名称是Java_NativeDemo_test( )。调用本机函数你必须用这样的名字。也就
是说,不是生成一个名为test( )的C函数,而是创建一个名为Java_NativeDemo_test( )函数。
生成了必备的头文件后,可以编写test( )执行文件并把它存在一个名为NativeDemo.c的
文件中:
/* This file contains the C version of the
test() method.
*/
#include <jni.h>
#include "NativeDemo.h"
#include <stdio.h>
JNIEXPORT void JNICALL Java_NativeDemo_test(JNIEnv *env, jobject obj)
{
jclass cls;
jfieldID fid;
jint i;
printf("Starting the native method./n");
cls = (*env)->GetObjectClass(env, obj);
fid = (*env)->GetFieldID(env, cls, "i", "I");
if(fid == 0) {
printf("Could not get field id./n");
return;
}
i = (*env)->GetIntField(env, obj, fid);
printf("i = %d/n", i);
(*env)->SetIntField(env, obj, fid, 2*i);
printf("Ending the native method./n");
}
注意此文件包含具有接口信息的jni.h文件。该文件由你的Java 编译器提供。头文件
NativeDemo.h预先已由javah创建。
该函数中,GetObjectClass( )方法用来获得一个含有NativeDemo类信息的C结构。
GetFieldID( )方法返回一个包含该类域名“i”信息的C结构。GetIntField()检索该域原来的
值。SetIntField( )存储该域的一个更新值(别的处理其他数据类型的方法参看文件jni.h)。
生成NativeDemo.c文件后,必须编译它生成一个DLL文件。用微软C/C++编译器来做,
使用下面的命令行:
Cl /LD NativeDemo.c
它生成了一个名为NativeDemo.dll的文件。该步骤完成,你可以执行Java 程序。该程序输出如下:
This is ob.i before the native method: 10
Starting the native method.
i = 10
Ending the native method.
This is ob.i after the native method: 20
以上摘自《JAVA 参考大全》
有个问题是为什么例如"FileOutputStream"这些类里并没有以下的调用?
static {
System.loadLibrary("NativeDemo");
}
以下是一个例子:
// A simple example that uses a native method.
public class NativeDemo {
int i;
public static void main(String args[]) {
NativeDemo ob = new NativeDemo();
ob.i = 10;
System.out.println("This is ob.i before the native method:" +
ob.i);
ob.test(); // call a native method
System.out.println("This is ob.i after the native method:" +
ob.i);
}
// declare native method
public native void test() ;
// load DLL that contains static method
static {
System.loadLibrary("NativeDemo");
}
}
注意test( )方法声明为native且不含方法体。简而言之这是我们用C语言实现的方法。
写完程序后,编译它生成NativeDemo.class。然后,你必须用javah.exe生成一个文件:
NativeDemo.h(javah.exe包含在JDK中)。在执行test( )时你要包含NativeDemo.h。为生成
NativeDemo.h,用下面的命令:
javah -jni NativeDemo
该命令生成名为NativeDemo.h的头文件。该文件必须包含在实现test()的C文件中。该命
令的输出结果如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class NativeDemo */
#ifndef _Included_NativeDemo
#define _Included_NativeDemo
#ifdef _ _cplusplus
extern "C" {
#endif
/*
* Class: NativeDemo
* Method: test
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_NativeDemo_test
(JNIEnv *, jobject);
#ifdef _ _cplusplus
}
#endif
#endif
注意函数的名称是Java_NativeDemo_test( )。调用本机函数你必须用这样的名字。也就
是说,不是生成一个名为test( )的C函数,而是创建一个名为Java_NativeDemo_test( )函数。
生成了必备的头文件后,可以编写test( )执行文件并把它存在一个名为NativeDemo.c的
文件中:
/* This file contains the C version of the
test() method.
*/
#include <jni.h>
#include "NativeDemo.h"
#include <stdio.h>
JNIEXPORT void JNICALL Java_NativeDemo_test(JNIEnv *env, jobject obj)
{
jclass cls;
jfieldID fid;
jint i;
printf("Starting the native method./n");
cls = (*env)->GetObjectClass(env, obj);
fid = (*env)->GetFieldID(env, cls, "i", "I");
if(fid == 0) {
printf("Could not get field id./n");
return;
}
i = (*env)->GetIntField(env, obj, fid);
printf("i = %d/n", i);
(*env)->SetIntField(env, obj, fid, 2*i);
printf("Ending the native method./n");
}
注意此文件包含具有接口信息的jni.h文件。该文件由你的Java 编译器提供。头文件
NativeDemo.h预先已由javah创建。
该函数中,GetObjectClass( )方法用来获得一个含有NativeDemo类信息的C结构。
GetFieldID( )方法返回一个包含该类域名“i”信息的C结构。GetIntField()检索该域原来的
值。SetIntField( )存储该域的一个更新值(别的处理其他数据类型的方法参看文件jni.h)。
生成NativeDemo.c文件后,必须编译它生成一个DLL文件。用微软C/C++编译器来做,
使用下面的命令行:
Cl /LD NativeDemo.c
它生成了一个名为NativeDemo.dll的文件。该步骤完成,你可以执行Java 程序。该程序输出如下:
This is ob.i before the native method: 10
Starting the native method.
i = 10
Ending the native method.
This is ob.i after the native method: 20
以上摘自《JAVA 参考大全》
相关文章推荐
- java的native使用方法
- java中native方法的使用
- java中native使用的方法
- JAVA JNI配置教程 使用JAVA调用Native方法打印Hello World
- java中native方法的使用
- 使用native方法扩展Java程序的功能详解
- 使用native方法扩展Java程序的功能
- java native方法使用及JNI实例
- 在java中使用和创建自定义的native方法
- JAVA中native方法的使用
- java里的native方法的使用正解
- 认识理解Java中native方法
- JAVA String.format 方法使用介绍
- 以 java 为例,总结下 appium 里的一方法的使用心得
- JAVA中enum使用方法
- Java 非阻塞I/O使用方法
- 简单完整的代码,通过这个代码你将对RSA加密算法在Java中的实现方法有一个初步的了解,这个类,你可以直接使用,水平高的,就自己修改完善下代码。
- java使用JNA(Java Native Access)调用dll的方法
- 使用Java,采用两种方法对50个随机整数求和
- Android Studio 2.2 让你5分钟配置好 OpenCV for Android(java层和native层都可以使用)