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,由本人搬运至阿里云开发者社区。

相关文章
|
6月前
|
存储 Java C++
[NDK/JNI系列02] JNI的设计原理与数据类型
[NDK/JNI系列02] JNI的设计原理与数据类型
49 0
[NDK/JNI系列02] JNI的设计原理与数据类型
|
6月前
|
JSON 机器人 Linux
推荐一款嵌入式Linux开源框架与封装-cpp-tbox
推荐一款嵌入式Linux开源框架与封装-cpp-tbox
131 3
|
6月前
|
Java API Android开发
[NDK/JNI系列01] NDK与JNI的基本概念与使用场景
[NDK/JNI系列01] NDK与JNI的基本概念与使用场景
70 0
|
6月前
|
编译器 调度 Android开发
构建高效Android应用:Kotlin协程的优雅解决方案
【4月更文挑战第14天】 在移动开发领域,性能优化和资源管理是提升用户体验的关键因素。随着Kotlin语言在Android平台上的普及,协程作为其核心特性之一,为开发者提供了一种轻量级的并发处理手段。本文将深入探讨Kotlin协程在Android应用中的运用,通过实例分析其如何简化异步任务,提升应用响应性,并保证代码的简洁与可维护性。我们将透过源码剖析、性能对比及最佳实践,揭示协程在现代Android开发中的重要角色。
|
6月前
|
Rust Java Linux
【一起学Rust | 进阶篇 | jni库】JNI实现Java与Rust进行交互
【一起学Rust | 进阶篇 | jni库】JNI实现Java与Rust进行交互
208 0
|
缓存 Java 编译器
JNI基础简介
JNI系列入门连载,开启JNI学习之旅吧。
109 0
|
存储 缓存 Java
NDK | 带你点亮 JNI 开发基石符文 (一)
NDK | 带你点亮 JNI 开发基石符文 (一)
144 0
NDK | 带你点亮 JNI 开发基石符文 (一)
|
Java API Android开发
JNI开发环境和基础配置
JNI开发环境和基础配置
406 0
JNI开发环境和基础配置
|
Java C++ Android开发
JNI开发极简教程
JNI(Java Native Interface) Java调用C/C++,C/C++调用Java的一套API 前言: 学习JNI需要C/C++的相关知识,而且需要研究JNI手册.
2460 0
|
Kotlin
Kotlin跨平台工程的构建
一、Kotlin官方已经提供了结合IDEA的跨平台工程的构建 打开IDEA,选择Kotlin 二、一路往下 三、构建完成后,如下图
1162 0
下一篇
无影云桌面