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

MacOS简单的JNI使用过程(我的是个maven项目)

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

MacOS简单的JNI使用过程(我的是个maven项目)

一.写JAVA代码
 private static final Logger log = LoggerFactory.getLogger(LinuxProcess.class);

   public MacOsXProcess() {
   }

   static {
       new FileUtils().loadLibrary("libmacjni.jnilib");
   }

   @Override
   public List getPids(int processId, String host) {
       List children = new ArrayList<>();
       Map parentPidMap = getParentPidMap(host);
       Map childrenParentPidMap = new HashMap<>();
       for (Map.Entry entry : parentPidMap.entrySet()) {
           childrenParentPidMap.put(entry.getValue(), entry.getKey());
       }

       Queue queue = new LinkedList<>();
       queue.add(processId);
       while (!queue.isEmpty()) {
           Integer currentPid = queue.poll();
           if (childrenParentPidMap.containsKey(currentPid)) {
               children.add(childrenParentPidMap.get(currentPid));
               queue.add(childrenParentPidMap.get(currentPid));
           }
       }
       log.info("Macos system ,get pids ={}", children);
       return children;
   }

   @Override
   public Map getParentPidMap(String host) {
       Map result = new HashMap<>();
       ProcessInfo[] processInfos = processTable();
       for (ProcessInfo processInfo : processInfos) {
           result.put(processInfo.getPid(), processInfo.getParentPid());
       }
       return result;
   }

   @Override
   public Integer getParentPid(int processId, String host) {
       return getParentPidMap(host).get(processId);
   }

   public native ProcessInfo[] processTable();
二.将项目编译为clss文件(maven项目class文件已经在target目录下)
  • 在项目的根目录下执行命令,产生的是MacOsXProcess.h文件
javah -classpath /Users/xxx/IdeaProjects/xxx/target/classes  org.apache.xxx.common.pid.process.MacOsXProcess
三. 编写.c文件
#include 


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

JNIEXPORT jobjectArray JNICALL Java_org_apache_xxxx_common_pid_process_MacOsXProcess_processTable
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif
四.编译c文件
  • 在MacOsXProcess.h中会有一句
#include 

jni.h是jdk中C语言库的头文件,在编译.c的时候需要指定jni.h的所在。在Mac OX中他所在的位置是:

${JAVA_HOME}/include

使用gcc编译

gcc -I/Library/Java/JavaVirtualMachines/jdk1.8.0_301.jdk/Contents/Home/include -c MacOsXProcess.c

就可以得到一个编译好的文件 MacOsXProcess.o,下面需要把.o文件打包成动态库。

五.将.o文件打包为动态库
gcc -dynamiclib -o libmacjni.jnilib MacOsXProcess.o

至此,java代码就可以调用c语言了。

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

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

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