头文件生成器-javah.exe

头文件生成器-javah.exe,第1张

javah头文件生成器 javah程序创建C头文件和存根文件 这些是把本地C成员函数包入java 所需要的 被创建的头文件给出了有关java类的信息 这些信息是C成员函数与java类交换数据所必需的 存根文件将用来创建将定义java对象的结构与数做java对象本身数据相联系的C文件 调用javah的命令行如下 C:\>javah options classname additionalClasses javah程序有些象java解释器 它只需要类名而不需要写 class扩展名 javah 程序可接受多个类名以产生文件头和存根文件 下表列出了javah程序命令行选项 选项 功薯纤衡能 o outputfile 此选项告诉javah将产生的所有文件头或存根文件都放到一个单独的文件 outputfile 中 d directory 此选项告知javah把产生的文件头或存根文件放入给定目录  竖备  td directory 此选项告知javah 程序把临时文件放入目录 dirrctory 而不是tmp目录中 stubs 此选项告知javah将产生存根文件而非头文件 verbose 此选项告知javah将产生文件的状态输出到标准输出设备 classpath path 此选项告知javah用 path 目录寻找类文件 多个目录之间应用分号分开 lishixinzhi/Article/program/Java/JSP/201311/19612

分类: 电脑/网络 >>程序设计 >>其他编程语言

问题描述:

现在在Linux 下使改带用java怎么样?delphi那?C#那?这些编程适合开发windows还是linux?

linux在中国有消衫哪些发展前景?需要什么样的人才?

希望各位踊跃发言,谢先!~

解析:

在Linux平台下如何实现本地共享库与Java协同工作。Hello World程序是目前标准的入门第一步,那么,我也以类拿歼腔似的应用最为样例。

第一步,定义一个 Java 类 -- Hello. 它提供SayHello方法:

此时应注意两点:

1、为要使用的每个本地方法编写本地方法声明,其声明方式与普通Java方法接口没什么不同,只是必须指定 native 关键字,如下所示:

public native void SayHello(String strName)

在这个函数中,我们将根据传进的人名,向某人问好。

2、必须显式地加载本地代码库。我们需在类的一个静态块中加载这个库:

static

{

System.loadLibrary("hello")

}

再加上必要的异常处理就生成如下源文件Hello.java:

public class Hello

{

static

{

try

{

此处即为本地方法所在链接库名

System.loadLibrary("hello")

}

catch(UnsatisfiedLinkError e)

{

System.err.println

( "Cannot load hello library:\n " +e.toString() )

}

}

public Hello()

{

}

声明的本地方法

public native void SayHello(String strName)

}

编译后生成Hello.class文件。

第二步,生成本地链接库。具体过程如下:

1、要为以上定义的类生成 Java 本地接口头文件,需使用javah,Java 编译器的 javah 功能将根据Hello类生成必要的声明,此命令将生成Hello.h文件,我们在共享库的代码中要包含它,javah不使默认内部命令,需要指明路径,它在JDK的bin目录下,在我的Linux环境下命令如下:

/home/jbuilder/jdk1.3.1/bin/javah Hello

生成的Hello.h 文件 内容如下所示:

/* DO NOT EDIT THIS FILE -

it is machine generated */

#include

/* Header for class Hello */

#ifndef _Included_Hello

#define _Included_Hello

#ifdef __cplusplus

extern "C" {

#endif

/*

* Class: Hello

* Method: SayHello

* Signature: (Ljava/lang/String)V

*/

JNIEXPORT void JNICALL Java_Hello_SayHello

(JNIEnv *, jobject, jstring)

#ifdef __cplusplus

}

#endif

#endif

要在java中调用c语言的野备库,需要使用Java提供了JNI。\x0d\x0a举例说明\x0d\x0a在c语言中定义一个 void sayHello()函数(打印Hello World)然后在Java中调用这个函数显示Hello Word.\x0d\x0a现在分别从Java和C语言两部分说明:\x0d\x0a1. Java 部分\x0d\x0a首先定义一个HelloNative,在其中申明sayHello函数,函数要申明为Native 类型的.如下:\x0d\x0apublic class HelloNative {\x0d\x0apublic native void sayHello()\x0d\x0a}\x0d\x0a\x0d\x0a编译这个类,生成class文件:\x0d\x0ajavac HelloWorld.java\x0d\x0a\x0d\x0a利用javah生成需要的h文件\x0d\x0ajavah HelloNative\x0d\x0a\x0d\x0a生成的 h文件大概如下:\x0d\x0a\x0d\x0a/* DO NOT EDIT THIS FILE - it is machine generated */\x0d\x0a#include \x0d\x0a/* Header for class HelloNative */\x0d\x0a\x0d\x0a#ifndef _Included_HelloNative\x0d\x0a#define _Included_HelloNative\x0d\x0a#ifdef __cplusplus\x0d\x0aextern "C" {\x0d\x0a#endif\x0d\x0a/*\x0d\x0a* Class: HelloNative\x0d\x0a* Method: sayHello\x0d\x0a* Signature: ()V\x0d\x0a*/\x0d\x0aJNIEXPORT void JNICALL Java_HelloNative_sayHello\x0d\x0a(JNIEnv *, jobject)\x0d\x0a\x0d\x0a#ifdef __cplusplus\x0d\x0a}\x0d\x0a#endif\x0d\x0a#endif\x0d\x0a\x0d\x0a可以看一下上面自动生梁模成的程序,程序include了jni.h,这个头文件在 $JAVA_HOME下的include文件夹下. 还可以发现生成的函数名是在之前的函数名前面加上了颂渣毁Java_HelloNative。\x0d\x0a2. C语言部分\x0d\x0a根据上面生成的h文件编写相应的代码实现,建立一个 HelloNative.cpp用来实现显示Hello World的函数.如下:\x0d\x0a\x0d\x0a#include \x0d\x0a#include "HelloNative.h"\x0d\x0a\x0d\x0aJNIEXPORT void JNICALL Java_HelloNative_sayHello(JNIEnv *, jobject)\x0d\x0a{\x0d\x0aprintf("Hello World!\n")\x0d\x0a}\x0d\x0a\x0d\x0a代码编写完成之后,我们再用gcc编译成库文件,命令如下\x0d\x0agcc -fPIC -I/usr/lib/jvm/java-7-openjdk-i386/include -I/usr/lib/jvm/java-7-openjdk-i386/include/linux -shared -o libHelloNative.so HelloNative.cpp\x0d\x0a\x0d\x0a这样就会在当前目录下生成一个libHelloNative.so的库文件.这时需要的库已经生成,在C语言下的工作已经完成了.\x0d\x0a接下来需要在Java中编写一个程序测试一下.在程序前,需要将我们的库载入进去.载入的方法是调用Java的 System.loadLibrary("HelloNative")\x0d\x0a\x0d\x0apublic class TestNative\x0d\x0a{\x0d\x0astatic {\x0d\x0atry {\x0d\x0aSystem.loadLibrary("HelloNative")\x0d\x0a}\x0d\x0acatch(UnsatisfiedLinkError e) {\x0d\x0aSystem.out.println( "Cannot load hello library:\n " + e.toString() )\x0d\x0a}\x0d\x0a}\x0d\x0apublic static void main(String[] args) {\x0d\x0aHelloNative test = new HelloNative()\x0d\x0atest.sayHello()\x0d\x0a}\x0d\x0a}\x0d\x0a\x0d\x0a但是再编译后,运行的时候,问题又出现了.\x0d\x0aCannot load hello library:\x0d\x0ajava.lang.UnsatisfiedLinkError: no HelloNative in java.library.path\x0d\x0aException in thread "main" java.lang.UnsatisfiedLinkError: HelloNative.sayHello()V\x0d\x0aat HelloNative.sayHello(Native Method)\x0d\x0aat TestNative.main(TestNative.java:13)\x0d\x0a\x0d\x0a载入库失败,但是库明明就是放在当前文件夹下的,怎么会载入失败呢?\x0d\x0a用System.getProperty("java.library.path")查看,发现java.library.path中并不u存在当前的目录.主要有以下的几个解决办法:\x0d\x0a1) 将生成的库复制到java.library.path有的路径中去,当然这样不是很好\x0d\x0a2) 设置环境变量export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH ,将当前的目录加入到LD_LIBRARY_PATH中\x0d\x0a3) 设置java 的选项,将当前的目录加入到其中 .java -Djava.library.path=. $LD_LIBRARY_PATH\x0d\x0a这样之后程序就能够成功的运行了.可以看见显示的"Hello World!"了


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12288610.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存