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

相关文章
|
7月前
|
存储 Java C++
[NDK/JNI系列02] JNI的设计原理与数据类型
[NDK/JNI系列02] JNI的设计原理与数据类型
53 0
[NDK/JNI系列02] JNI的设计原理与数据类型
|
7月前
|
Java API Android开发
[NDK/JNI系列01] NDK与JNI的基本概念与使用场景
[NDK/JNI系列01] NDK与JNI的基本概念与使用场景
87 0
|
Java
Java方法与函数:面向对象编程的支柱
Java方法与函数:面向对象编程的支柱
87 0
|
中间件 开发工具 数据库
AppDelegate模块化历程
AppDelegate控制着App的主要生命周期,比如App初始化完成后构建主视图,App接收到远程消息回调,Url-Scheme回调,第三方SDK初始化,数据库初始化等等。 基于这个原因,随着App的版本迭代,AppDelegate中的代码量会越来越大。当AppDelegate的代码量到达一定程度时,我们就该开始考虑将AppDelegate中的代码进行模块化封装。
90 0
|
存储 缓存 编解码
JNI之常见技巧与陷阱
NDK/JNI连载系列
128 0
|
存储 缓存 Java
NDK | 带你点亮 JNI 开发基石符文 (一)
NDK | 带你点亮 JNI 开发基石符文 (一)
148 0
NDK | 带你点亮 JNI 开发基石符文 (一)
|
存储 Java 数据挖掘
AGP 实现方法插桩探究
AGP 实现方法插桩探究
211 0
AGP 实现方法插桩探究
|
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手册.
2474 0