windows环境下,java调用c语言的方法

1.环境

  • C语言编译器:工具比较多,本文使用的是gcc,带gcc的软件业比较丰富,我使用的是TDM-GCC, 注:网上很多使用的是MinGW,但我遇到了很多坑,最终在联想软件商店中下载的TDM-GCC,nice
  • java环境

2.编写native方法java工具类,主要负责与本地native方法链接,不负责业务逻辑

package com.xieshaoping.jni;/*** @author XieShaoping*/
public class NativeEntity {public native String getNativeMsg();public NativeEntity(String filename) {System.load(filename);}}

3.编写调用native方法java的类,主要负责业务逻辑

package com.xieshaoping.jni;import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** @author XieShaoping*/
@RestController
public class LoadlibraryController {@RequestMapping("loadlibrary")public String loadlibrary(String lib) {NativeEntity nativeEntity = new NativeEntity(lib);String msg = nativeEntity.getNativeMsg();System.out.println(msg);return msg;}}

4.编译java生产class

javac NativeEntity.java

5.使用javah生成标头文件

javah -jni com.xieshaoping.jni.NativeEntity

注:直接输入javah -jni NativeEntity时会报错的,因为java有page的概念,需要在根目录下运行上述,命令

此时生产了com_xieshaoping_jni_NativeEntity.h文件

编写C语言

#include<stdlib.h>
#include<string.h>
#include <stdio.h>
#include <math.h>
#include <windows.h> //linux下,需要注释
#include "com_xieshaoping_jni_NativeEntity.h"JNIEXPORT jstring JNICALL Java_com_xieshaoping_jni_NativeEntity_getNativeMsg(JNIEnv* env, jobject obj) //一定要与.h里的保持一致
{//打印内容char *msg = "正在调用本地本地native方法-windows";printf(msg);//char * 转为jstringjclass strClass = (*env)->FindClass(env, "java/lang/String");jmethodID ctorID = (*env)->GetMethodID(env, strClass, "<init>","([BLjava/lang/String;)V");jbyteArray bytes = (*env)->NewByteArray(env, strlen(msg));(*env)->SetByteArrayRegion(env, bytes, 0, strlen(msg), (jbyte *) msg);jstring encoding = (*env)->NewStringUTF(env, "utf-8");return (jstring) (*env)->NewObject(env, strClass, ctorID, bytes, encoding);
}

7.gcc生成类库文件

gcc -m64  -Wl,--add-stdcall-alias -I"D:\MyTool\Java\jdk1.8.0_251\include" -I"D:\MyTool\Java\jdk1.8.0_251\include\win32" -shared WindowsNative.c

-m64 生成64位

-o 命名,默认a.exe

8.运行程序

http://localhost:8080/loadlibrary?lib=D%3A%5CMyProject%5Cjni%5Csrc%5Cmain%5Cjava%5Ccom%5Cxieshaoping%5Cjni%5Ca.exe

显示C语言方法输出的内容

linux环境下,java调用c语言的方法

与windows大部分相同, 不同处:

  • 删除“#include <windows.h>”
  • 添加java环境变量
export JAVA_HOME=/root/jdk1.8.0_311
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib
  • gcc生成类库文件
gcc -I"/root/jdk1.8.0_311/include" -I"/root/jdk1.8.0_311/include/linux" -fPIC -shared LinuxNative.c

默认生成a.out文件

运行成功

大功告成!

附代码:
https://gitee.com/xieshaoping/jni

window与linux环境下,java调用c语言的方法相关推荐

  1. window 和 linux 环境下杀死tomcat进程——也可以解决其他端口被占用的问题

    window 和 linux 环境下杀死tomcat进程--也可以解决其他端口被占用的问题 参考文章: (1)window 和 linux 环境下杀死tomcat进程--也可以解决其他端口被占用的问题 ...

  2. 关于linux环境下访问Windows数据库的处理方法

    ** 关于linux环境下访问Windows数据库的处理方法 1 首先需要知道windows系统下的ip地址,打开cmd控制台,输入ipconfig这个命令,获取window的本地ip地址,方便lin ...

  3. win、linux环境下JAVA+GDAL部署,jar包启动,相关描述,问题解决

    文章目录 windows环境下JAVA+GDAL 1.GDAL下载 2.GDAL安装(既解压后拷贝) 3.GDAL测试 4.Jar包方式运行 https://www.jianshu.com/p/6bc ...

  4. linux环境下java开发_Linux Ubuntu系统下Java开发环境搭建

    软件151田杰中 2. 在合适的路径下创建文件夹用来存储Java JDK,本例选择在/opt目录下新建JVM子文件夹.操作如下 打开Terminal(后文成为T1),输入: cd /opt       ...

  5. Linux环境下java安装、配置

    因经常需要配置服务器上的环境,本人对java也不擅长,特写此总结,以便后续使用 1. 下载系统对应的jdk版本(下载地址)或者(百度云下载地址 提取码:s8wm ): 2. 把下载的文件放到 /usr ...

  6. Linux环境下 java程序提交spark任务到Yarn报错

    文章目录 摘要 情况1:JSON解析异常 情况2:java.lang.InstantiationException spark.sql.driver 情况3: 中kafka:java.lang.NoC ...

  7. Linux 环境下Java环境变量配置

    1. JDK安装包获取注意事项 由于Oracle的JDK下载需要用户登录并接受协议,lunix环境使用wget下载的jdk只是 一个登录的网页,因此无法进行解压.可以手动下载后选择本地上传. 登录Or ...

  8. 举例讲解Linux系统下Python调用系统Shell的方法

    http://www.jb51.net/article/74508.htm 有时候难免需要直接调用Shell命令来完成一些比较简单的操作,比如mount一个文件系统之类的.那么我们使用Python如何 ...

  9. linux环境下的TIME_WAIT和CLOSE_WAIT问题解决方法

    再谈应用环境下的TIME_WAIT和CLOSE_WAIT 昨天解决了一个HttpClient调用错误导致的服务器异常,具体过程如下: http://blog.csdn.net/shootyou/art ...

最新文章

  1. 三星android获取root权限,三星G9250(S6 Edge公开版全网通 Android 5.1)获取ROOT权限详解教程...
  2. 加权平均融合消除图像拼接的拼缝(Python 代码)
  3. 2.10. 代码片段:demo方法(Core Data 应用程序实践指南)
  4. 一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少...
  5. allegro PCB 引脚网络名不显示之解决办法
  6. strcpy 函数的实现
  7. 单词数 (STL set集合)
  8. HTTP 错误 500.22 - Internal Server Error 检测到在集成的托管管道模式下不适用的 ASP.NET 设置。...
  9. IOS 高级语法与设计模式5(5.3 协议的基本概念及用法)
  10. actorx importer 下载_红色新店开业无线端PSD模板_psd素材免费下载_ 640*6001像素(编号:13631922)...
  11. 01.Python基础_菜单_快捷键_基本语法_变量_输入输出
  12. linux pmap was java,jvm 《九》pmap linux 命令介绍 及使用
  13. 剑指Offer——跳台阶
  14. WordPress 三个必须的安全措施
  15. java文件读写的基本类_java常用工具类(三)—— 文件读取的操作类
  16. 湾区人工智能私密圈|湾区AI精英汇
  17. 关于访问远程服务器的一些基本操作
  18. C/C++ C# unity Python 帮助文档 书籍 学习资料
  19. C++序列式容器(STL序列式容器)
  20. 深度学习--概率图模型(一)

热门文章

  1. 电子信息工程、通信工程、电气类等专业面试将会遇到试题大全
  2. Gedit浏览器常用快捷键备注
  3. SQL Server数据库删除和修改
  4. RESIDE数据集简单介绍
  5. 基于PHP和MySQL实现的高校成绩管理系统
  6. ora-01722 无效数字_ORA-01722: 无效数字的解决方法
  7. 何才能利用绩效管理和薪酬管理激励员工?
  8. JavaScript基础--改变this指向的方法
  9. 引入txtai,这是一种基于Transformers的AI驱动的搜索引擎
  10. 【牛客】Old Bill(C语言)