JavaWeb技术干货程序猿阵线联盟-汇总各类技术干货

Java中的native方法实现(Java混用C/C++)

2017-12-04  本文已影响9人  53b3f4658edc

前言

实现步骤

1.书写一个Java类

public class HelloWorld {
    // 使用关键字native来声明方法
    public native void displayInfor(String name);
    
    // 加载动态链接库 
    static {
        System.load("/Users/mac/Desktop/HelloWorldImpl.dylib");
    }
    
    public static void main(String[] args) {
        HelloWorld helloWorld = new HelloWorld();
        helloWorld.displayInfor("冯强");
    }
}

其中public native void displayInfor(String name);,声明了一个本地方法,有参数name,返回类型void。
System.load("/Users/mac/Desktop/HelloWorldImpl.dylib");表示加载一个本地动态链接库。

2.使用下javac命令编译该文件:

Macs-MacBook-Pro:Desktop mac$ javac HelloWorld.java 

我们会看到生成了一个HelloWorld.class文件


微信公众号:JavaWeb架构师

3.使用javah命令处理HelloWorld.class文件

Macs-MacBook-Pro:Desktop mac$ javah -jni HelloWorld

这时候我们可以看到生成了一个HelloWorld.h文件:


图片.png

4.打开HelloWorld.h文件

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

#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     HelloWorld
 * Method:    displayInfor
 * Signature: (Ljava/lang/String;)V
 */
JNIEXPORT void JNICALL Java_HelloWorld_displayInfor
  (JNIEnv *, jobject, jstring);

#ifdef __cplusplus
}
#endif
#endif

其中:

JNIEXPORT void JNICALL Java_HelloWorld_displayInfor
  (JNIEnv *, jobject, jstring);

就是Java代码中对应的native方法,命名格式是 Java_类名_方法名(JNIEnv,jobject,这里是参数)。

5.修改HelloWorld.h文件中的#include <jni.h>为#include "jni.h"

6.拷贝/Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home/include下面的jni.h到与HelloWorld.h相同的目录下


微信公众号:JavaWeb架构师

7.新建一个HelloWorld.cpp文件,实现其中的JNIEXPORT void JNICALL Java_HelloWorld_displayInfor
(JNIEnv *, jobject, jstring);方法

// 引入刚刚通过class文件生成的.h文件
#include "HelloWorld.h"
#include <stdio.h>
#include <iostream>

using namespace std;
/*
 * Class:     HelloWorld
 * Method:    displayInfor
 * Signature: (Ljava/lang/String;)V
 */
JNIEXPORT void JNICALL Java_HelloWorld_displayInfor
(JNIEnv * env, jobject obj, jstring name) {
    cout<<"你好,"<<env->GetStringUTFChars(name, NULL)<<endl;
}
微信公众号:JavaWeb架构师

8.使用g++处理HelloWorld.cpp生成动态链接库

Macs-MacBook-Pro:Desktop mac$ g++ -dynamiclib -o HelloWorldImpl.dylib HelloWorld.cpp 
微信公众号:JavaWeb架构师

9.复制HelloWorldImpl.dylib文件的地址,放入到java文件中

System.load("/Users/mac/Desktop/HelloWorldImpl.dylib");

10.最终的文件如下:


微信公众号:JavaWeb架构师

11.运行Java程序

Macs-MacBook-Pro:Desktop mac$ java HelloWorld
你好,冯强
微信公众号:JavaWeb架构师

其它

关注下方公众号,回复:jni.code
完整教程PDF版本下载
上一篇 下一篇

猜你喜欢

热点阅读