在Java中调用C/C++代码实现

在Java中利用native关键字调用C/C++实现过程整理如下:

书写Java代码

使用javah命令编译成头文件

在codeblocks中创建SharedLibrary工程

复制头文件内容并书写实现代码

配置C工程编译环境并编译成dll文件

复制dll到Java工程目录下

执行Java程序

第一步:书写Java代码

在Eclipse中创建Java工程:JavaNativeDemo,创建包:com.xuetang9.nativedemo

package com.xuetang9.nativedemo;

/**

* Java中使用native关键字调用C/C++实现

* @author 老九学堂·窖头

* @version 1.0

* @date 2017年6月8日 上午10:21:03

* @copyright 老九学堂

*

*/

public class Sample {

//native修饰的方法就是我们需要用C/C++来实现的方法。

public native int intMethod(int n);

}

第二步:使用JDK自带的javah命令将.java文件编译成头文件

操作本步骤的前提:已配置好Java的环境变量
首先进入工程目录:

进入源文件src目录,在命令行中输入以下命令:
javah -jni com.xuetang9.nativedemo.Sample

得到了文件:com_xuetang9_nativedemo_Sample.h

第三步:在codeblocks中创建SharedLibrary工程

这里我命名的工程名称为:LibSample

第四步:复制头文件内容并书写实现代码

4-1:在工程LibSample中创建头文件:com_xuetang9_nativedemo_Sample.h

4-2:复制使用javah生成的头文件内容到com_xuetang9_nativedemo_Sample.h中(也可以直接在项目中导入头文件)以下代码为自动生成,不需要修改。

com_xuetang9_nativedemo_Sample.h

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

#include <jni.h>

/* Header for class
com_xuetang9_nativedemo_Sample */

#ifndef
_Included_com_xuetang9_nativedemo_Sample

#define
_Included_com_xuetang9_nativedemo_Sample

#ifdef __cplusplus

extern "C" {

#endif

/*

*
Class:     com_xuetang9_nativedemo_Sample

*
Method:    intMethod

*
Signature: (I)I

*/

JNIEXPORT jint JNICALL Java_com_xuetang9_nativedemo_Sample_intMethod

(JNIEnv *, jobject, jint);

#ifdef __cplusplus

}

#endif

#endif

4-3:删除main.c文件中的代码,引入头文件com_xuetang9_nativedemo_Sample.h并直接实现其中的方法即可main.c

#include "com_xuetang9_nativedemo_Sample.h"

#include <stdio.h>

JNIEXPORT jint JNICALL
Java_com_xuetang9_nativedemo_Sample_intMethod

(JNIEnv * evn, jobject obj, jint intValue)

{

printf("来自Java的整型参数:%d\n", intValue);

return intValue;

}

5、配置C工程编译环境并编译成dll文件

5-1:配置编译器 – (Codeblocks中选择菜单:设置->编译器)

5-2:编译,生成dll文件

生成的dll文件在工程根目录中的bin->Debug下


小伙伴们如果想修改生成的文件名,可以右键工程->属性,在下图所示的地方修改生成的文件名即可。

6、复制dllJava工程目录下

7、执行Java程序

package
com.xuetang9.nativedemo;

/**

*
一个Native Method就是一个Java调用非Java代码的接口。

*
一个Native Method是这样一个Java的方法:该方法的实现由非Java语言实现,比如C或C++。

*
@author 老九学堂·窖头

*
@version 1.0

*
@date 2017年6月8日 上午10:21:03

*
@copyright 老九学堂

*
@remarks TODO

*

*/

public class Sample {

//native方法就是我们需要用C来实现的方法。

//javah -jni com.xuetang9.nativedemo.Sample

public native int intMethod(int n);

public static void main(String[] args) {

//加载动态类库,Windows下就是libLibSample.dll,Linux下就是libLibSample.so

//注意:不可以在代码中写上后缀dll或so

System.loadLibrary("libLibSample");

Sample sample = new Sample();

int square = sample.intMethod(5);

System.out.println("调用C语言实现的方法得到的结果:" + square);

}

}

更多干货笔记关注微信公众号 : 老九学堂

原文地址:https://www.cnblogs.com/ljxt/p/11612914.html

时间: 2024-10-12 03:13:49

在Java中调用C/C++代码实现的相关文章

java中调用kettle转换文件

java中调用kettle转换文件 通过命令行也可以调用,然后java中调用命令行代码也可以:这样没有和java代码逻辑无缝集成.本文说明kettle5.1中如果通过其他API和java代码无缝集成:网上大多数资料都是低版本的,在kettle5.x中已经不能运行. 1.       需要哪些jar文件 以kettle开头的是必须,上图最下面三个也要:红色框中的两个是我测试转换用到的,分别是生成UUID和文件. 要是少了jar文件,运行程序一定报错,大家根据错误到kettle安装目录LIB中找相应

如何在Java中调用Python代码

有时候,我们会碰到这样的问题:与A同学合作写代码,A同学只会写Python,而不会Java, 而你只会写Java并不擅长Python,并且发现难以用Java来重写对方的代码,这时,就不得不想方设法“调用对方的代码”. 下面我将举一些简单的小例子,借此说明:如何在Java中调用Python代码. 看懂这篇文章只需要具备: 熟悉Java的基本语法 懂一点点Python 主要内容如下: 什么是Jython? 一个HelloPython程序 在Jvm中执行Python脚本 仅在Java中调用Python

在java中调用python方法

1.http://sourceforge.net/projects/jython/下载jython包,把其中的jython.jar添加到工程目录 示例: 1.摘自:http://blog.csdn.net/anbo724/article/details/6608632 1.在java类中直接执行python语句 import javax.script.*; import org.python.util.PythonInterpreter; import java.io.*; import sta

java中成员变量、代码块、构造函数执行顺序

1.java虚拟机运行程序,首先需要装载类,安装现装载父类,初始化父类的静态代码块和静态成员变量 再load子类.初始化子类静态代码块和成员变量 2.load完毕父类与子类后,从main函数入口执行程序,先输出,接着new实例化Beetle类,则先实例化父类Insect,实例化父类时,先初始化非静态成员变量和非静态代码块,接着执行父类构造方法 再实例化子类,实例化子类时,先初始化非静态成员变量和非静态代码块,接着执行子类构造方法. package it.xiangnan.test; public

Java中调用c/c++语言出现Exception in thread &quot;main&quot; java.lang.UnsatisfiedLinkError: Test.testPrint(Ljava/lang/String;)V...错误

错误: Exception in thread "main" java.lang.UnsatisfiedLinkError: Test.testPrint(Ljava/lang/String;)V at Test.testPrint(Native Method) at Test.main(Test.java:8) 解决方法: 昨天一天都在想办法解决这个问题,操作步骤按照教程来的,怎么会出错呢?想了半天,觉得还是dll文件生成的不对.所以,最后决定把codeblocks换成visual

Java中调用MatLab返回值

当在Java中使用MatLab函数时,由于语言语法的不同,Matlab返回多个数据时,想在Java中获取到并进行使用.查阅了网上资料,翻箱倒柜加上自己实战,得出方法如下: 如MatLab函数返回的是N个变量值,其中有单个的数值.一维数组.二维数组等. 在Java中,使用Object[] rs=cmatlab.matlabfun(n , ....);接受返回的参数.其中rs[k]代表返回列表中第k个返回的变量的值. 如果rs[k]是单个数值,比如Double型.则使用下面的方法转换为Java中的D

java中调用dll文件的两种方法

一中是用JNA方法,另外是用JNative方法,两种都是转载来的, JNA地址:http://blog.csdn.net/shendl/article/details/3589676   JNative地址:http://www.jb51.net/article/35232.htm JNA方法: 介绍 给大家介绍一个最新的访问本机代码的Java框架—JNA. JNA(Java Native Access)框架是一个开源的Java框架,是SUN公司主导开发的,建立在经典的JNI的基础之上的一个框架

批量扫描雏形之在Java中调用nmap进行主机探测

在Java中通过调用Runtime这个类可以执行其他的可执行程序,执行后返回一个进程(Process),利用Process这个类我们可以取得程序执行的回显,因此在Java中调用nmap进行主机探测的原理就很清晰了.通过给函数传递nmap所在路径和我们需要执行的命令即可 具体实现代码: /**  * 调用nmap进行扫描  * @param nmapDir nmap路径  * @param command 执行命令  *   * @return 执行回显  * */ public String g

在java中调用Oracle存储过程

在java中调用Oracle存储过程 本文介绍如何通过java来调用Oracle的存储过程 1. 编写存储过程 CREATE OR REPLACE PROCEDURE sp_pro3(sp_name VARCHAR2,sp_sal NUMBER ) IS BEGIN --根据用户名修改工资 UPDATE emp SET sal=sp_sal WHERE ename=sp_name; END; 引入jdbc6.jar,编写测试类Test.java package testOraclePro; im