JNI的开发方法

简介: 本文通过一个案例,教读者一步一步实现一个简单的JNI项目。

JNI

JNI是JavaNativeInterface的缩写,通过使用Java本地接口书写程序,可以确保代码在不同的平台上方便移植。

本文通过一个案例,教读者一步一步实现一个简单的JNI项目。

需要准备的工具是:Java开发工具(IDEA)、C开发IDE(CLion)、……

创建含native的Java类并编译

笔者基于IDEA创建Java工程,命名为java-jni-demo,在src目录下创建HelloJNI.java

public class HelloJNI {

    /**
     * 定义本地方法,Unsafe类有大量类似方法声明
     *
     * @param name 打招呼的对象
     */
    public native void sayHello(String name);

}

笔者使用的Java8可用javah -jni -o hellojni.h HelloJNI命令生成.h文件,Java11以后可以使用javac -h . HelloJNI.java命令去生成.h文件。

生成的hellojni.h文件内容为:

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

#ifndef _Included_HelloJNI
#define _Included_HelloJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     HelloJNI
 * Method:    sayHello
 * Signature: (Ljava/lang/String;)V
 */
JNIEXPORT void JNICALL Java_HelloJNI_sayHello
  (JNIEnv *, jobject, jstring);

#ifdef __cplusplus
}
#endif
#endif

此时,可以新建CLion的Library工程hellojni,修改CMakeLists.txt文件:

cmake_minimum_required(VERSION 3.21)
project(hellojni C)

set(CMAKE_C_STANDARD 99)

include_directories(D:\\Java8\\jdk1.8.0_131\\include)
include_directories(D:\\Java8\\jdk1.8.0_131\\include\\win32)
link_directories(D:\\Java8\\jdk1.8.0_131\\lib)

add_library(hellojni SHARED library.c)

笔者选择直接加四行代码去引入java提供的dll文件,以得到结果。

hellojni.h复制进项目中,完成library.c

#include "hellojni.h"
#include <jni.h>
#include <jni_md.h>

#include <stdio.h>

JNIEXPORT void JNICALL Java_HelloJNI_sayHello(JNIEnv *env, jobject obj, jstring name) {
    const char *str = (*env)->GetStringUTFChars(env, name, 0);
    printf("Hello, %s!", str);
}

运行生成libhellojni.dll,复制到原Java工程中,创建Main.java

public class Main {

    public static void main(String[] args) {
        System.load("D:\\IDEA\\java-jni-demo\\src\\libhellojni.dll");
        new HelloJNI().sayHello("BlankSpace");
    }

}

要注意的是,System.load()中的内容是绝对路径。

运行Main.java,得到输出:

image.png

说明:本文原载于CSDN,由本人搬运至阿里云开发者社区。

相关文章
|
IDE Java 开发工具
FOXBORO FBM233 P0926G 作为面向对象语言构建
FOXBORO FBM233 P0926G 作为面向对象语言构建
138 0
FOXBORO FBM233 P0926G 作为面向对象语言构建
|
存储 缓存 Java
NDK | 带你点亮 JNI 开发基石符文 (一)
NDK | 带你点亮 JNI 开发基石符文 (一)
148 0
NDK | 带你点亮 JNI 开发基石符文 (一)
|
Swift
swift语言之函数的基本构架
swift语言之函数的基本构架
155 0
swift语言之函数的基本构架
|
Java C++ Android开发
JNI开发极简教程
JNI(Java Native Interface) Java调用C/C++,C/C++调用Java的一套API 前言: 学习JNI需要C/C++的相关知识,而且需要研究JNI手册.
2476 0
|
容器
COM组件开发实践(一)
   Preface       因为项目需要,开始从事ActiveX方面的工作,看了一些资料,可惜都是些COM原理方面的,没有切合实际动手的东西,在CodeProject上读完David Marcionek的文章【1】后,收获良多,但也遇到一些恼人的小问题,因此在其基础上就一些易错点做些小注解。
1199 0
|
数据库 iOS开发 设计模式
iOS-《编写高质量代码》笔记-第七章 设计模式与Cocoa编程
建议45:设计模式是特定环境下的特定问题的解决方案 设计模式是某种特定设计的模板或指导原则。 建议46:MVC模式是一种复合或聚合模式 MVC 是一种高级别的模式,关注的是应用程序的全局架构,并根据各种对象在程序中发挥的作用对其进行分类。
1047 0
iOS-《编写高质量代码》笔记-第六章 继承与面向对象设计
建议41:明确isa在继承上的作用 图片发自简书App 我们发现 Class 本身也有一个isa指针,指向的是它的MetaClass。 当我们对一个实例发送消息时(-开头的方法),会在该 instance 对应的类的 methodLists 里查找。
927 0