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

相关文章
|
5天前
|
存储 Java C++
[NDK/JNI系列02] JNI的设计原理与数据类型
[NDK/JNI系列02] JNI的设计原理与数据类型
9 0
[NDK/JNI系列02] JNI的设计原理与数据类型
|
5天前
|
Java API Android开发
[NDK/JNI系列01] NDK与JNI的基本概念与使用场景
[NDK/JNI系列01] NDK与JNI的基本概念与使用场景
16 0
|
3月前
|
Rust Java Linux
【一起学Rust | 进阶篇 | jni库】JNI实现Java与Rust进行交互
【一起学Rust | 进阶篇 | jni库】JNI实现Java与Rust进行交互
80 0
|
存储 缓存 Java
NDK | 带你点亮 JNI 开发基石符文 (一)
NDK | 带你点亮 JNI 开发基石符文 (一)
100 0
NDK | 带你点亮 JNI 开发基石符文 (一)
|
Android开发
【Android 插件化】“ 插桩式 “ 插件化框架 ( 运行应用 | 代码整理 )(一)
【Android 插件化】“ 插桩式 “ 插件化框架 ( 运行应用 | 代码整理 )(一)
107 0
【Android 插件化】“ 插桩式 “ 插件化框架 ( 运行应用 | 代码整理 )(一)
|
Android开发
【Android 插件化】“ 插桩式 “ 插件化框架 ( 运行应用 | 代码整理 )(二)
【Android 插件化】“ 插桩式 “ 插件化框架 ( 运行应用 | 代码整理 )(二)
122 0
【Android 插件化】“ 插桩式 “ 插件化框架 ( 运行应用 | 代码整理 )(二)
|
Android开发
【Android 插件化】“ 插桩式 “ 插件化框架 ( 运行应用 | 代码整理 )
【Android 插件化】“ 插桩式 “ 插件化框架 ( 运行应用 | 代码整理 )
110 0
【Android 插件化】“ 插桩式 “ 插件化框架 ( 运行应用 | 代码整理 )
|
Android开发
【Android 插件化】“ 插桩式 “ 插件化框架 ( 运行应用 | 代码整理 )(三)
【Android 插件化】“ 插桩式 “ 插件化框架 ( 运行应用 | 代码整理 )(三)
108 0
|
NoSQL Java Linux
JNI 调试技术
如果你像我一样是一个 Java 程序员,并且经常进行 JNI 代码的开发,那么你一定也体会到了调试 JNI 代码的困难,比如有一天突然程序意外崩溃了,我们很难搞清楚它到底是因为什么崩溃的。接下来我要介绍的这几个技术,可以帮助我们快速的解决上述问题。
|
架构师 Java 编译器
组件化框架设计之apt编译时期自动生成代码&动态类加载(二)
组件化,框架设计,编译,动态类加载,阿里