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

一.写JAVA代码

 private static final Logger log = LoggerFactory.getLogger(LinuxProcess.class);

   public MacOsXProcess() {
   }

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

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

       Queue<Integer> 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<Integer, Integer> getParentPidMap(String host) {
       Map<Integer, Integer> 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文件

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

#ifndef _Included_org_apache_xxxx_common_pid_process_MacOsXProcess
#define _Included_org_apache_xxxx_common_pid_process_MacOsXProcess
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     org_apache_xxxx_common_pid_process_MacOsXProcess
 * Method:    processTable
 * Signature: ()[Lorg/apache/xxxx/common/pid/core/ProcessInfo;
 */
JNIEXPORT jobjectArray JNICALL Java_org_apache_xxxx_common_pid_process_MacOsXProcess_processTable
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

四.编译c文件

  • 在MacOsXProcess.h中会有一句
#include <jni.h>

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语言了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值