java如何调用c语言?(java如何调用c程序写的代码)

网友投稿 437 2022-06-13


因为在实现一些业务逻辑时,考虑到代码的安全性或者保证代码执行的效率,会调用C语言/C++来实现。所以,下面就来讲一下java如何调用C/C++:

第一,jni方式调用c接口。通过将c语言接口封装为jni的方式直接供java语言调用,这个可以说是最惯用的方式。

编写java代码:

package com.netease.test.model;

/**

* Created by hzjiaoguangcai on 2017/6/22.

*/

public class JniDemo {

//使用JAVAH命令生成包含native方法定义的C/C++头文件。

//该命令需要使用JDK/bin目录下javah.exe

public native void sayHello(int a,boolean b);

static { System.loadLibrary("demo"); };

/**

* @param args

*/

public static void main(String[] args) {

JniDemo jniDemo = new JniDemo();

System.out.println(System.getProperty("java.library.path"));

jniDemo.sayHello(100,false);

}

}

在java工程的com同级目录下编译执行/usr/lib/jvm/jdk8/bin/javac com/netease/test/model/JniDemo.java

生成com/netease/test/model/JniDemo.class 文件

然后执行/usr/lib/jvm/jdk8/bin/javah com.netease.test.model.JniDemo,

这时会在com统计目录下生成一个

com_netease_test_model_JniDemo.h的文件,内容:

/* DO NOT EDIT THIS FILE - it is machine generated */

#include

/* Header for class com_netease_test_model_JniDemo */

#ifndef _Included_com_netease_test_model_JniDemo

#define _Included_com_netease_test_model_JniDemo

#ifdef __cplusplus

extern "C" {

#endif

/*

* Class: com_netease_test_model_JniDemo

* Method: sayHello

* Signature: (IZ)V

*/

JNIEXPORT void JNICALL Java_com_netease_test_model_JniDemo_sayHello

(JNIEnv *, jobject, jint, jboolean);

#ifdef __cplusplus

}

#endif

#endif

编写一个这个头文件的实现demo.c,内容如下:

/* DO NOT EDIT THIS FILE - it is machine generated */

#include

#include

/* Header for class com_netease_test_model_JniDemo */

#include "com_netease_test_model_JniDemo.h"

/*

* Class: com_netease_test_model_JniDemo

* Method: sayHello

* Signature: ()V

*/

JNIEXPORT void JNICALL Java_com_netease_test_model_JniDemo_sayHello

(JNIEnv *a, jobject jo, jint i, jboolean b){

printf("HelloWorld JNI %d! %d\n",i,b);

}

编译这个.c文件产生一个共享动态库,debian(32位)系统中在demo.c所在目录下执行的命令。

gcc -o libdemo.so -fPIC -shared demo.c -I${JAVA_HOME}/include -I${JAVA_HOME}/include/linux -L${JRE_HOME}/lib/i386/client

这时候产生一个libdemo.so的文件,将libdemo.so复制到/usr/lib目录下。

备注:可以现根据 System.out.println(System.getProperty("java.library.path")); 的输出结果加载库所在的位置,而把libdemo.so放在响应的位置。

最后编译JniDemo.java

/usr/lib/jvm/jdk8/bin/javac com/netease/test/model/JniDemo.java

运行:

/usr/lib/jvm/jdk8/bin/java com/netease/test/model/JniDemo

输出

/usr/java/packages/lib/i386:/lib:/usr/lib

HelloWorld JNI 100! 0

第二,jna方式调用c接口。jna也是其中一种调用c接口的方式。使用时可以加载动态库.dll或.so,然后调用库中的接口。

第三,如果c接口很简单,可以将c接口编译为可执行程序,使用java直接调用可执行程序,也不失为一种简单快捷的方式。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:python编程100例分享,附下载方式(Python编程:从入门到实践下载)
下一篇:Python教程:软件安装与下载(python软件下载安装步骤)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~