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进行调用外部函数,就可以轻松实现程序功能。