编程学习网 > 编程语言 > C/C++开发 > java如何调用c语言?(java如何调用c程序写的代码)
2022
06-04

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

因为在实现一些业务逻辑时,考虑到代码的安全性或者保证代码执行的效率,会调用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 <jni.h>
/* 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 <jni.h>
#include <stdio.h>
/* 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直接调用可执行程序,也不失为一种简单快捷的方式。

其他两种方法的具体操作,就不做赘述,想要了解更多关于C语言教程欢迎持续关注编程学习网

扫码二维码 获取免费视频学习资料

Python编程学习

查 看2022高级编程视频教程免费获取