JNI 使用教程

雷薄
• 阅读 2871

编写 Java 测试类

public class TestJNI {

    // 定义 native 方法
    private native void say();

    static {
        // 加载动态库
        // 从当前路径或 java.library.path 查找, 去掉文件扩展名, macos 需要去掉 lib 前缀
        System.loadLibrary("TestJNI");

        // 或者使用文件绝对路径加载
        // System.load( "/path/to/TestJNI.so");
    }

    public static void main(String[] args) {
        new TestJNI().say();
    }
}

利用 Java 类生成 C++ 头文件

javah TestJNI

修改 TestJNI.h#include <jni.h> -> #include "jni.h"
这样会优先从当前目录寻找 jni.h 头文件

编写 TestJNI.cpp 文件

#include "TestJNI.h"

JNIEXPORT void JNICALL Java_TestJNI_say (JNIEnv *env, jobject obj) {
    printf("hello world");
}

编译 C++ 代码, 生成动态链接库

  1. 拷贝依赖的 JNI 相关头文件到当前目录, 或者使用 gcc 编译时指定参数 -I $JAVA_HOME/include -I $JAVA_HOME/include/darwin

    cp $JAVA_HOME/include/jni.h .
    cp $JAVA_HOME/include/darwin/jni_md.h .
  2. 编译

    • Linux

      gcc -shared TestJNI.cpp -o TestJNI.so
    • MacOS

      gcc -dynamiclib TestJNI.cpp -o libTestJNI.dylib -I $JAVA_HOME/include -I $JAVA_HOME/include/darwin
    • Windows

      gcc -shared TestJNI.cpp -o TestJNI.dll -I $JAVA_HOME/include -I $JAVA_HOME/include/darwin

编译运行 Java Class

javac TestJNI.java
java TestJNI

如何查看 java.library.path 地址

public class PrintJavaLibPath {

    public static void main(String[] args) {
        String[] split = System.getProperty("java.library.path").split(":");
        for (String string : split) {
            System.out.println(string);
        }
    }
}

源码

https://github.com/kense-lab/...

参考

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
4年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Karen110 Karen110
4年前
一篇文章带你了解JavaScript日期
日期对象允许您使用日期(年、月、日、小时、分钟、秒和毫秒)。一、JavaScript的日期格式一个JavaScript日期可以写为一个字符串:ThuFeb02201909:59:51GMT0800(中国标准时间)或者是一个数字:1486000791164写数字的日期,指定的毫秒数自1970年1月1日00:00:00到现在。1\.显示日期使用
Wesley13 Wesley13
4年前
Java爬虫之JSoup使用教程
title:Java爬虫之JSoup使用教程date:201812248:00:000800update:201812248:00:000800author:mecover:https://imgblog.csdnimg.cn/20181224144920712(https://www.oschin
Wesley13 Wesley13
4年前
JNI 技巧
JNI是指Java本地层接口(JavaNativeInterface)。它为用Java语言编写的受控代码定义了一种与本地层代码(用C/C编写)交互的方式。它是厂商无关的,其支持从动态共享库加载代码,尽管有时笨重,但它仍是有效的。如果你对它还不熟悉,可以阅读JNI规范(JavaNativeInterfaceSpecifica
Stella981 Stella981
4年前
SpringBoot整合Redis乱码原因及解决方案
问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa
Wesley13 Wesley13
4年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Easter79 Easter79
4年前
SpringBoot整合Redis乱码原因及解决方案
问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa
Wesley13 Wesley13
4年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Python进阶者 Python进阶者
2年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这