栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Linux环境java使用jni调用本地方法

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Linux环境java使用jni调用本地方法

干活前先把流程理清楚,先把工作场景,分析步骤

1.创建一个本地方法的java定义(就是native方法定义)

2.将java定义转化成c定义(c定义就是.h文件,就是头文件,头文件其实就是将各个.c文件中重复的声明、宏定义等提取出来放进一个文件中,便于其他.c文件共用这部分的代码)

3.实现c定义(.c文件引用c定义,然后将c定义中的方法实现了)

4.将c实现转化成链接库

5.加载链接库,调用本地方法触发链接库的实现

先查看本地方法的类,步骤1

public class NativeUtils {
    
    public native int max(int i, int y);
}

编译生成字节码文件:javac NativeUtils.java,目录下多了.class文件,步骤2

编译生成头文件:javah NativeUtils,目录下多了.h文件

查看头文件

#include 


#ifndef _Included_NativeUtils
#define _Included_NativeUtils
#ifdef __cplusplus
extern "C" {
#endif

JNIEXPORT jint JNICALL Java_NativeUtils_max
  (JNIEnv *, jobject, jint, jint);

#ifdef __cplusplus
}
#endif
#endif

我们能发现其实就是定义了一个方法:Java_NativeUtils_max

实现头文件中定义的方法,步骤3

接下来写实现这个头包含的方法NativeUtilsImpl.c(注意要添加参数名,下面是env、obj、i、j)

#include
#include
#include"NativeUtils.h"

JNIEXPORT jint JNICALL Java_NativeUtils_max
  (JNIEnv * env, jobject obj, jint i, jint j){
      int k = (i>j)?i:j;
	  printf("max : %d n",k);
      return k;
}

执行命令生成链接库,步骤4

gcc -I [jdk目录]/include -I [jdk目录]/include/linux/ -fPIC -shared -o NativeUtilsImpl.so NativeUtilsImpl.c

生成链接库文件:NativeUtilsImpl.so

创建测试类,步骤5

public class TestNative {
    static {
        System.load("NativeUtilsImpl.so完整路径");
    }

    public static void main(String[] args) {
        System.out.println("result : " +
                new NativeUtils().max(
                        Integer.valueOf(args[0]), Integer.valueOf(args[1])));
    }
}

编译执行(max是c的输出,result是java的输出)

javac TestNative.java

java TestNative 1 5  输出 max : 5   result : 5

java TestNative 7 5  输出 max : 7   result : 7

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/530985.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号