Java通过JNI的方式调用C

1、调用原理

用java的javah命令将java native 方法编译成.h,在C程序中调用此.h文件,并实现.h文件里面声明的方法,编译生成.dll文件,最后java通过System.loadLibrary()加载.dll文件,调用具体的方法实现;

2、具体操作步骤:

1、编译JAVA类

1public class TestJNI { 2 // 加载编译好的.dll文件 3 static 4 { 5 System.loadLibrary( "VsDll" ); 6 } 7 // 声明调用C的方法名称,注意用native修饰 8 public native static int cToJava(); 9 // 测试是否配置成功 10 public static void main(String[] args) { 11 System.out.println(cToJava()); 12 } 13}

2、执行生成.h文件的命令

1// 进入cdm,cd 到项目目录 2// 生成.class文件 3 javac TestJNI.java 4// 生成.h文件 5 javah TestJNI 6// 生成文件如下: 7/* DO NOT EDIT THIS FILE - it is machine generated */ 8#include <jni.h> 9/* Header for class TestJNI */ 10 11#ifndef _Included_TestJNI 12#define _Included_TestJNI 13#ifdef __cplusplus 14extern "C" { 15#endif 16/* 17 * Class: TestJNI 18 * Method: cToJava 19 * Signature: ()I 20 */ 21JNIEXPORT jint JNICALL Java_TestJNI_cToJava 22 (JNIEnv *, jclass); 23 24#ifdef __cplusplus 25} 26#endif 27#endif

3、在Visual Studio中创建VsDll项目

11、创建dll项目参考:http://jingyan.baidu.com/article/ff411625ad116612e48237a4.html 2 3 2、新建一个.cpp文件 4 #include "jni.h" 5 #include "TestJNI.h" 6 JNIEXPORT jint JNICALL Java_TestJNI_cToJava 7 (JNIEnv *, jclass){ 8 return 1; 9 }

4、将生成的.dll文件拷贝到java项目下

1// 配置.dll文件访问路径,以idea为例 2// 在项目路径下新建一个lib文件夹将生成的.dll文件拷贝到此文 3//件夹下面,并在VM中配置此参数: 4 -Djava.library.path=E:\javaProject\lib

3、注意事项

  • 1、需要将java安装目录下**\Java\jdk1.8.0_60\include 里面的jni.h ,以及**\Java\jdk1.8.0_60\include\win32目录下的jni_md.h拷贝到vs项目的目录下
  • 2、修改生成的TestJNI.h文件里面对jni.h的引用形式为: #include "jni.h",
  • 3、修改在.cpp文件里面对jni的引用格式也为:#include "jni.h"
  • 4、注意VS的编译器和JDK的编译要对应,比如: VS用x64,JDK是64位的,如果VS是32,JDK是64,则需要修改VS的 解决方案平台,具体参考:http://blog.csdn.net/zhounanzhaode/article/details/50322841
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

Java日期时间API系列31

  时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到。Java中本来已经有相关获取时间戳的方法,Java8后增加新的类Instant等专用于处理时间戳问题。 1获取时间戳的方法和性能对比1.1获取时间戳方法Java8以前

Java多态实现原理

Java多态概述多态是面向对象编程语言的重要特性,它允许基类的指针或引用指向派生类的对象,而在具体访问时实现方法的动态绑定。Java对于方法调用动态绑定的实现主要依赖于方法表,但通过类引用调用(invokevirtual)和接口引用调用(invokeinterface)的实现则有所不同。类引用调用的大致过程为:Java编译器将Java源代码编译成c

FLV文件格式

1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.