linux java调用c java代码执行linux命令

其实linux java调用c的问题并不复杂,但是又很多的朋友都不太了解java代码执行linux命令,因此呢,今天小编就来为大家分享linux java调用c的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!

JAVA如何调用C函数

要在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<jni.h>

/* Header for class HelloNative*/

#ifndef _Included_HelloNative

#define _Included_HelloNative

#ifdef __cplusplus

extern"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<stdio.h>

#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"+ e.toString());

}

}

public static void main(String[] args){

HelloNative test= new HelloNative();

test.sayHello();

}

}

但是再编译后,运行的时候,问题又出现了.

Cannot load hello library:

java.lang.UnsatisfiedLinkError: no HelloNative in java.library.path

Exception in thread"main" java.lang.UnsatisfiedLinkError: HelloNative.sayHello()V

at HelloNative.sayHello(Native Method)

at TestNative.main(TestNative.java:13)

载入库失败,但是库明明就是放在当前文件夹下的,怎么会载入失败呢?

用System.getProperty("java.library.path")查看,发现java.library.path中并不u存在当前的目录.主要有以下的几个解决办法:

1)将生成的库复制到java.library.path有的路径中去,当然这样不是很好

2)设置环境变量export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH,将当前的目录加入到LD_LIBRARY_PATH中

3)设置java的选项,将当前的目录加入到其中.java-Djava.library.path=.$LD_LIBRARY_PATH

这样之后程序就能够成功的运行了.可以看见显示的"Hello World!"了

java如何调用c语言源文件并进行执行

要在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!"了

Linux与Java调用C编程实战linuxjava调c

Linux是当今人们最常用的操作系统了。凭借其丰富的功能,它可以实现构建功能强大的服务器,增强网络安全性,极大的满足IP能力的需求,并且以高性能和负载方面非常实用稳健。而Java在服务器端应用领域也是势不可挡,可以在Linux环境下,充分发挥Java优势。那么当Linux和Java结束搭配使用,要如何调用C语言编程进行实现呢?

1、下载并编译C语言源程序。在Linux系统下,可以复制下载C语言源程序,利用GCC编译器编译,生成要调用的可执行文件。

例如:

$gcc test.c-o test

2、在Java程序中调用C程序。在编译成功生成目标文件后,可以利用Java的Runtime类,来执行一个外部的可执行文件。

例如:

String[] cmd={“/bin/sh”,”-c”,”./test”};//定义

Runtime.getRuntime().exec(cmd);//执行

3、用JNI实现对C语言程序的调用。但是,使用Runtime来实现调用外部可执行文件,会存在参数传递比较复杂的问题。此时可以利用Java语言的原生接口(JNI),向C程序传递参数,实现高效的外部函数调用。

例如:

//调用C语言程序

int num1= 2, num2= 3;

int result= addition(num1, num2);

//声明native方法

public native int addition(int num1, int num2);

//加载链接库

System.loadLibrary(“math”);

在Linux的环境中,实现Linux与Java如何调用C语言编程,只需要完成下载、编译C语言程序,使用Runtime类调用,或者使用JNI进行调用外部函数,就可以轻松实现程序功能。

阅读剩余
THE END