java编译c语⾔_如何⽤java调⽤c语⾔编译器实现在线编译c语
⾔?
慕⽥峪7331174
要在java中调⽤c语⾔的库,需要使⽤Java提供了JNI。举例说明在c语⾔中定义⼀个 void sayHello()函数(打印Hello World);然后在Java中调⽤这个函数显⽰Hello Word.现在分别从Java和C语⾔两部分说明:1. Java 部分⾸先定义⼀个HelloNative,在其中申明sayHello函数,函数要申明为Native 类型的.如下:public class HelloNative {public native void sayHello();}编译这个类,⽣成class⽂件:javac
HelloWorld.java利⽤javah⽣成需要的h⽂件javah HelloNative⽣成的 h⽂件⼤概如下:/* DO NOT EDIT THIS FILE - it is machine generated */#include /* Header for class HelloNative */#ifndef _Included_HelloNative#define _Included_HelloNative#ifdef
__cplusplusextern "C" {#endif/** Class: HelloNative* Method: sayHello* Signature: ()V*/JNIEXPORT void JNICALL
Java_HelloNative_sayHello(JNIEnv *, jobject);#ifdef __cplusplus}#endif#endif可以看⼀下上⾯⾃动⽣成的程序,程序include了jni.h,这个头⽂件在 $JAVA_HOME下的include⽂件夹下. 还可以发现⽣成的函数名是在之前的函数名前⾯加上了Java_HelloNative。2. C语⾔部分根据上⾯⽣成的h⽂件编写相应的代码实现,建⽴⼀个 HelloNative.cpp⽤来实现显⽰Hello World的函数.如下:#include #include "HelloNative.h"JNIEXPORT void JNICALL Java_HelloNative_sayHello(JNIEnv *, jobject){printf("Hello World!\n");}代码编写完成之后,我们再⽤gcc编译成库⽂件,命令如下;gcc -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这样就会在当前⽬录下⽣成⼀个libHelloNative.so的库⽂件.这时需要的库已经⽣成,在C语⾔下的⼯作已经完成了.接下来需要在Java中编写⼀个程序测试⼀下.在程序前,需要将我们的库载⼊进去.载⼊的⽅法是调⽤Java的 System.loadLibrary("HelloNative");public class TestNative{static {try
{System.loadLibrary("HelloNative");}catch(UnsatisfiedLinkError e) {System.out.println( "Cannot load hello library:\n " +
va.lang.UnsatisfiedLinkError: no HelloNative in java.library.pathException in thread "main" java.lang.UnsatisfiedLinkError: HelloNative.sayHello()Vat HelloNative.sayHello(Native Method)at
TestNative.main(TestNative.java:13)载⼊库失败,但是库明明就是放在当前⽂件夹下的,怎么会载⼊失败呢?⽤
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论