Java使用JNI调用C/C++方法

需要的文件:

一个java文件:SayHello.java

内容:

public class SayHello{
    public native void sayHello();
    static {
        System.loadLibrary("hellodll");
    }
    public static void main(String[]args){
        new SayHello().sayHello();
    }
}

一个C/C++文件

内容:

#include <stdio.h>
#include "jni.h"
#include "SayHello.h"
JNIEXPORT void JNICALL Java_SayHello_sayHello(JNIEnv *a, jobject b){
  printf("helloworld");
}

其他文件

复制过来的

jni.h位置:C:\Program Files\Java\jdk-9.0.1\include
jni_md.h位置:C:\Program Files\Java\jdk-9.0.1\include\win32

自动生成的

hellodll.dll
SayHello.class

所有文件:


 E:\NotePadPP\JNI 的目录

2017/12/05  20:33    <DIR>          .
2017/12/05  20:33    <DIR>          ..
2017/12/05  20:24            15,872 hellodll.dll
2017/11/20  11:13            73,955 jni.h
2017/11/20  11:13               485 jni_md.h
2017/12/05  20:23               452 SayHello.class
2017/12/05  20:23               394 SayHello.h
2017/12/05  20:21               192 SayHello.java
2017/12/05  20:24               161 TestHello.c
               7 个文件         91,511 字节
               2 个目录 68,734,390,272 可用字节

步骤:

1:新建SayHello.java文件
2:编译SayHello.java文件
命令javac SayHello.java 此时在文件夹下会产生SayHello.class文件
3:使用命令javah产生一个和java文件同名的头文件,
命令javah SayHello此时在文件夹下回产生一个SayHello.h文件
因为jni.h文件在同一个文件夹下所有需要把#include<jni.h>改为#include"jni.h"
内容如下:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include "jni.h"
/* Header for class SayHello */

#ifndef _Included_SayHello
#define _Included_SayHello
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     SayHello
 * Method:    sayHello
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_SayHello_sayHello
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

4:新建TestHello.c文件
内容是:

#include <stdio.h>
#include "jni.h"
#include "SayHello.h"
JNIEXPORT void JNICALL Java_SayHello_sayHello
  (JNIEnv *a, jobject b){
  printf("helloworld");
}

5:使用命令:g++ -shared -Wl,-kill-at -s -o hellodll.dll TestHello.c产生一个dll文件,文件名称是hellodll.dll
此时在文件夹下回多出一个hellodll.dll文件

参数含义
-shared编译成.dll库文件
-s减小dll文件的大小
-o目标文件名
-Wl,–kill-at防止编译后的函数名被自动加上@符号,并取消警告。

6:java SayHello
输出helloworld
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值