MangoCool

JNI Demo in linux(在linux环境下的JNI示例程序)

2022-05-20 14:59:23   作者:网络   来源:网络

开发环境:

win10

jdk1.8+

idea


测试环境:

centos7

gcc

g++

openjdk1.8+


JniDemo类:

package com.mangocool.jni;

public class JniDemo {

    public static void main(String[] args) {
        System.out.println("hello, this is java!");
        new JniDemo().hello();
    }

    public native void hello();

    static {
        System.loadLibrary("cpp_lib_demo");
    }
}


通过jdk自带javah命令生成c++的头文件:

假设你已经将java配置到了系统变量中:

javah -classpath D:\workDir\studyDemo\src\main\java com.mangocool.jni.JniDemo

生成的头文件com_mangocool_jni_JniDemo.h在你的工程的根目录下:

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

#ifndef _Included_com_mangocool_jni_JniDemo
#define _Included_com_mangocool_jni_JniDemo
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_mangocool_jni_JniDemo
 * Method:    hello
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_com_mangocool_jni_JniDemo_hello
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif


根据头文件实现c++代码cppDemo.cpp

#include "com_mangocool_jni_JniDemo.h" // Import generated header file.
#include "jni.h"

JNIEXPORT void JNICALL Java_com_mangocool_jni_JniDemo_hello
  (JNIEnv * env, jobject jb){
      printf("%s","hello, this is cpp!");
}


创建Makefile文件:

libcpp_lib_demo.so : cppDemo.cpp
	g++ -o $@ $+ -fPIC -shared -I /root/jdk1.8.0_321/include -I /root/jdk1.8.0_321/include/linux

.PHONY : clean
clean :
	rm libcpp_lib_demo.so

注:记得修改/root/jdk1.8.0_321成你的java路径


将JniDemo.class、cppDemo.cpp、com_mangocool_jni_JniDemo.h、Makefile复制到Centos7下进行编译以及测试:

创建目录jni_demo,以上文件都放在目录下:


进入目录,执行make命令:

可以看到生成了libcpp_lib_demo.so

因为java示例代码有包路径,所以:

mkdir -p com/mangocool/jni
mv JniDemo.class com/mangocool/jni/


测试命令:

[root@localhost jni_demo]# /root/jdk1.8.0_321/bin/java -Djava.library.path='.' com.mangocool.jni.JniDemo
hello, this is java!
hello, this is cpp!

注:定动态库的路径-Djava.library.path='.',这里是从当前目录下加载动态libcpp_lib_demo.so


参考来源:https://blog.51cto.com/u_11466419/3792561

标签: JNI demo linux centos7 示例程序

分享:

上一篇在linux上使用java exec执行多条cmd

下一篇GMT、UTC、DST、CST时区代表的意义

关于我

崇尚极简,热爱技术,喜欢唱歌,热衷旅行,爱好电子产品的一介码农。

座右铭

当你的才华还撑不起你的野心的时候,你就应该静下心来学习,永不止步!

人生之旅历途甚长,所争决不在一年半月,万不可因此着急失望,招精神之萎葸。

Copyright 2015- 芒果酷(mangocool.com) All rights reserved. 湘ICP备14019394号

免责声明:本网站部分文章转载其他媒体,意在为公众提供免费服务。如有信息侵犯了您的权益,可与本网站联系,本网站将尽快予以撤除。