linux运行可执行文件,通过c语言调用java的main方法

前言:以前一直在做Android开发,在某本书上看过一句话“Android上面不只有App类的程序可以运行,能在linux下运行的程序,也可以在Android上面运行”

一.编写C语言部分代码

1.定义java.h头文件

#include <jni.h>#ifndef _JAVA_H_
#define _JAVA_H_int JNICALL JavaMain(void* args);#endif /*_JAVA_H */

2.定义java.c

#include <stdlib.h>
#include <stdio.h>#include "java.h"int JNICALL JavaMain(void* args)
{JavaVM* vm = NULL;JNIEnv* env = NULL;jclass mainClass = NULL;jmethodID mainID;jobjectArray mainArgs;JavaVMInitArgs vm_args;JavaVMOption options[1];options[0].optionString = "-Djava.class.path=.";vm_args.version = JNI_VERSION_1_2;vm_args.nOptions = 1;vm_args.options = options;jint status = -1;printf("JavaMain enter \n");status = JNI_CreateJavaVM(&vm, &env, &vm_args);if (status != JNI_OK){printf("initialize jvm failed \n");return -1;}mainClass = (*env)->FindClass(env, "JavaTest");if (mainClass != NULL){printf("find class ssuccessfully \n");jmethodID mainID = (*env)->GetStaticMethodID(env, mainClass, "main", "([Ljava/lang/String;)V");if (mainID != NULL){printf("get static method successfully \n");jobjectArray mainArgs;(*env)->CallStaticVoidMethod(env, mainClass, mainID, mainArgs);}}if (vm){(*vm)->DestroyJavaVM(vm);}return 0;
}

上面的代码主要分为以下几个部分

  1. 1.创建java虚拟机
  2. 2.找到java类
  3. 3.获取到java的方法
  4. 4.调用java方法

注意:上面的java类的名字时JavaTest,被调用的方法就是main方法

3.编写可执行文件的java_jni_test.c

#include <stdio.h>#include "java.h"int main(void)
{printf("java-jni-test main \n");JavaMain(NULL);return 0;
}

4.编写编译脚步文件(cmake)

cmake_minimum_required(VERSION 3.18.1)project("java-jni")set(JVM_LIB_PATH /Library/Java/JavaVirtualMachines/jdk-1.8.jdk/Contents/Home/jre/lib/server)link_directories(${JVM_LIB_PATH})include_directories(java-jniPUBLIC /Library/Java/JavaVirtualMachines/jdk-1.8.jdk/Contents/Home/includePUBLIC /Library/Java/JavaVirtualMachines/jdk-1.8.jdk/Contents/Home/include/darwin)add_library(java-jni SHAREDjava.c)target_link_libraries(java-jnijvm)add_executable(java_jni_samplejava_jni_test.c)target_include_directories(java_jni_samplePUBLIC /Library/Java/JavaVirtualMachines/jdk-1.8.jdk/Contents/Home/includePUBLIC /Library/Java/JavaVirtualMachines/jdk-1.8.jdk/Contents/Home/include/darwin)target_link_libraries(java_jni_samplejava-jnijvm)

二.编写java语言部分代码

编写JavaTest.java文件代码

public class JavaTest {public static void main(String[] args) {System.out.println("Test java main Method: say Hello");}
}

三.执行效果如下

四.参考资料

《Java并发编程之美》

Linux上c++通过JNI调用java代码笔记_linux jni c++ 函数传参-CSDN博客

Linux环境中使用JNI实现C语言分别调用 java class 和 java jar-CSDN博客

五.源代码下载

下载源代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/296482.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络概述(下)——“计算机网络”

各位CSDN的uu们你们好呀&#xff0c;今天继续计算机网络概述的学习&#xff0c;下面&#xff0c;让我们一起进入计算机网络概述的世界吧&#xff01;&#xff01;&#xff01; 计算机网络体系结构 数据传输流程 计算机网络性能指标 计算机网络体系结构 两个计算机系统必须高度…

大数据技术学习笔记(十一)—— Flume

目录 1 Flume 概述1.1 Flume 定义1.2 Flume 基础架构 2 Flume 安装3 Flume 入门案例3.1 监控端口数据3.2 实时监控单个追加文件3.3 实时监控目录下多个新文件3.4 实时监控目录下的多个追加文件 4 Flume 进阶4.1 Flume 事务4.2 Flume Agent 内部原理4.3 Flume 拓扑结构4.3.1 简单…

springcloud-gateway-2-鉴权

目录 一、跨域安全设置 二、GlobalFilter实现全局的过滤与拦截。 三、GatewayFilter单个服务过滤器 1、原理-官方内置过滤器 2、自定义过滤器-TokenAuthGatewayFilterFactory 3、完善TokenAuthGatewayFilterFactory的功能 4、每一个服务编写一个或多个过滤器&#xff0c…

ubuntu22.04+ROS2推荐匹配的gazebo版本

放大以后看到&#xff1a; 可以看到ros2推荐使用版本是humble-----匹配的是Ubuntu22.04LTS -------匹配gazebo Harmonic

Cannot resolve plugin org.springframework.boot:spring-boot-maven-plugin:2.6.4

我出现这个问题就是idea的设置里面的maven路径跟我本地的maven路径不一致&#xff0c;所以出现了这个问题。引入这个项目踩了一个多小时的坑&#xff0c;最终重装了一下maven&#xff0c;把它整理了下&#xff0c;终于好了。。。 把我重装maven的方法博客贴在这&#xff0c;这…

AndroidStudio无法新建aidl文件解决办法

我用的 AS 版本是 Android Studio Giraffe | 2022.3.1 Build #AI-223.8836.35.2231.10406996, built on June 29, 2023 右键新建 aidl 文件&#xff0c; 提示 (AIDL File)Requires setting the buildFeatures.aidl to true in the build file 解决办法 修改 app 的 build.…

2024年,我们要勇敢奔跑!

本“人民&#xff0b;体验官”推广人民日报官方微博文化产品《2024年是个什么年&#xff1f;》 图&#xff1a;来源“人民&#xff0b;体验官”推广平台 朋友&#xff0c;2023已经进入尾声阶段&#xff0c;很快新的一年——2024年就来了。这新的一年是新中国成立75周年、澳门回…

Python实现多个sheet表合并

Python实现sheet表的合并 代码展示&#xff1a; import pandas as pd# 读取Excel文件 excel_file pd.ExcelFile(1221001.xlsx)# 获取所有表单名 sheet_names excel_file.sheet_names print(f"合并的sheet表单如下&#xff1a;\n{sheet_names}") print("\n&q…

计算机是如何工作的(下)

4. 编程语言&#xff08;Program Language&#xff09; 本块内容主要是还原下我们已经熟悉的编程语言&#xff0c;即编程语言是如何和 CPU 指令对应起来的。 4.1 程序&#xff08;Program&#xff09; 所谓程序&#xff0c;就是一组指令以及这组指令要处理的数据。狭义上来说&…

前缀和+单调双队列+贪心:LeetCode2945:找到最大非递减数组的长度

本文涉及知识点 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 单调双队列 贪心 题目 给你一个下标从 0 开始的整数数组 nums 。 你可以执行任意次操作。每次操作中&#xff0c;你需要选择一个 子数组 &#xff0c;并将这个子数组用它所…

游戏交易平台源码,游戏账号交易平台,手游交易平台PHP源码

源码介绍 游戏账号交易平台源码&#xff0c;平台内置几套模版&#xff0c;支持商品发布&#xff0c;支持自助广告&#xff0c;支持会员注册&#xff0c;支持在线支付&#xff0c;搭建起来运营当个副业也不错。 安装教程 1.亲测环境&#xff1a;LinuxNginx1.16.1PHP5.6Mysql5…

MongoDB安装部署

二、安装部署 2.1 下载 下载地址&#xff1a;MongoDB Enterprise Server Download | MongoDB 当前最新版本6.0.9&#xff0c;5.0.9对Mac m1需要centos 8.2版本。选择docker安装。 2.2 docker-ce安装 # 安装docker # 默认repo源没有docker-ce安装包&#xff0c;需要新的rep…