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-jni
        PUBLIC /Library/Java/JavaVirtualMachines/jdk-1.8.jdk/Contents/Home/include
        PUBLIC /Library/Java/JavaVirtualMachines/jdk-1.8.jdk/Contents/Home/include/darwin)

add_library(java-jni SHARED
        java.c)

target_link_libraries(java-jni
        jvm)

add_executable(java_jni_sample
        java_jni_test.c)

target_include_directories(java_jni_sample
        PUBLIC /Library/Java/JavaVirtualMachines/jdk-1.8.jdk/Contents/Home/include
        PUBLIC /Library/Java/JavaVirtualMachines/jdk-1.8.jdk/Contents/Home/include/darwin)

target_link_libraries(java_jni_sample
        java-jni
        jvm)

二.编写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博客

五.注意事项

1.这个需要先使用命令编译出java文件的class文件出来

javac JavaTest.java

2.在编写java.c文件的过程中,遇到java相关方法的签名,可以执行如下命令(前提是class文件已经生成了)

javap -classpath ./ -s JavaTest

六.源代码下载

下载源代码

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CSS新手入门笔记整理:动画

在CSS3中&#xff0c;我们可以使用animation属性来实现元素的动画效果。animation属性和transition属性的区别。 transition属性只能将元素的某一个属性从一个属性值过渡到另一个属性值。只能实现一次性的动画效果。animation属性来可以将元素的某一个属性从第1个属性值过渡到…

ubuntu18.04下安装vue

1、更新源 sudo apt update 2、安装nodejs sudo apt install nodejs 查看node版本 nodejs -v 但是此处要的版本是v16.14.2版本&#xff0c;所以要更新 # 查看当前node版本 node -v# 清除npm缓存 npm cache clean -f# 全局安装n npm install -g n# 升级到最新稳定版 n sta…

适用于车载电动升窗器的解决方案

升窗器是指避免车主忘记关窗的自动关窗装置&#xff0c;主要通过电子模块加认组合&#xff0c;利用主机上的芯片里面设定的程序完成检测功能&#xff0c;使自动升窗步骤顺利完成。 ■ 基于ACM32F403系列MCU ■ 高性价比软件控制方案&#xff0c;高算力 ■ MCU内置2路CAN总线&a…

C#/WPF 播放音频文件

C#播放音频文件的方式&#xff1a; 播放系统事件声音使用System.Media.SoundPlayer播放wav使用MCI Command String多媒体设备程序接口播放mp3&#xff0c;wav&#xff0c;avi等使用WindowsMediaPlayer的COM组件来播放(可视化)使用DirectX播放音频文件使用Speech播放(朗读器&am…

鞋服用户运营策略如何实现有效闭环?

实现长期价值和业务闭环是企业经营的关键。对于鞋服行业来说&#xff0c;如何基于客户旅程编排&#xff08;Customer Journey Orchestration&#xff0c;简称 CJO&#xff09;实现用户运营策略的有效闭环&#xff0c;提升长期价值呢&#xff1f; 本文围绕该主题&#xff0c;从鞋…

天呐,我找到财务报表开发的通关密码了!

要问我们IT最不愿做的报表开发有哪些&#xff0c;首当其冲的一定是财务分析。我对开发财务报表这事就一个态度&#xff1a;只要不谈开发财务报表&#xff0c;我们就还是好朋友&#xff0c;谈了会怎样&#xff1f;不好意思&#xff0c;我会破大防。 1、财务的分析逻辑和需求&am…

【c++、数据结构课设】哈夫曼树

时间过的真快&#xff0c;转眼之间一个学期即将结束&#xff0c;想必这个时候大家都在准备各科的课设作业&#xff0c;本期内容是我的数据结构课设&#xff0c;希望能给大家带来帮助&#xff0c;如果有任何不足或需要改进的地方&#xff0c;欢迎各位提出宝贵的意见。 屏幕录制2…

【GoLang】Go语言几种标准库介绍(一)

你见过哪些令你膛目结舌的代码技巧&#xff1f; 文章目录 你见过哪些令你膛目结舌的代码技巧&#xff1f;前言几种库bufio&#xff08;带缓冲的 I/O 操作&#xff09;特性示例 bytes (实现字节操作)特性示例 总结专栏集锦写在最后 前言 随着计算机科学的迅猛发展&#xff0c;编…

前端---vscode 的基本使用

1. vscode 的基本介绍 全拼是 Visual Studio Code (简称 VS Code) 是由微软研发的一款免费、开源的跨平台代码编辑器&#xff0c;目前是前端(网页)开发使用最多的一款软件开发工具。 2. vscode 的安装 下载网址: Download Visual Studio Code - Mac, Linux, Windows选择对应…

(企业 / 公司项目)如何使用分布式任务调度框架Quartz集成 和 SpringBoot自带的定时任务集成?

SpringBoot自带的定时任务 首先在你的微服务项目中创建一个新的模块&#xff0c;定时调度模块 pom.xml里面关联公共模块common的依赖其他不需要改变 然后启动类别删&#xff0c;启动项目是否报错&#xff0c;写一个简单的测试类访问路径是否成功 package com.jiawa.train.bat…

C语言:字符串字面量及其保存位置

相关阅读 C语言https://blog.csdn.net/weixin_45791458/category_12423166.html?spm1001.2014.3001.5482 虽然C语言中不存在字符串类型&#xff0c;但依然可以通过数组或指针的方式保存字符串&#xff0c;但字符串字面量却没有想象的这么简单&#xff0c;本文就将对此进行讨论…

【Linux】僵尸与孤儿 进程等待

目录 一&#xff0c;僵尸进程 1&#xff0c;僵尸进程 2&#xff0c;僵尸进程的危害 二&#xff0c;孤儿进程 1&#xff0c;孤儿进程 三&#xff0c;进程等待 1&#xff0c;进程等待的必要性 2&#xff0c;wait 方法 3&#xff0c;waitpid 方法 4&#xff0c;回收小结…

华为OD机试 - 学生方阵 - 矩阵(Java 2023 B卷 200分)

目录 专栏导读一、题目描述二、输入描述三、输出描述1、输入2、输出 四、解题思路1、题目解析2、解体思路 五、Java算法源码再重新读一遍题目&#xff0c;看看能否优化一下~ 六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导…

阶段十-物业项目

可能遇到的错误&#xff1a; 解决jdk17javax.xml.bind.DatatypeConverter错误 <!--解决jdk17javax.xml.bind.DatatypeConverter错误--><dependency><groupId>javax.xml.bind</groupId><artifactId>jaxb-api</artifactId><version>…

使用 fixture 机制重构 appium_helloworld

一、前置说明 在 pytest 基础讲解 章节,介绍了 pytest 的特性和基本用法,现在我们可以使用 pytest 的一些机制,来重构 appium_helloworld 。 appium_helloworld 链接: 编写第一个APP自动化脚本 appium_helloworld ,将脚本跑起来 代码目录结构: pytest.ini 设置: [pyt…

IntelliJ IDEA插件

插件安装目录&#xff1a;C:\Users\<username>\AppData\Roaming\JetBrains\IntelliJIdea2021.2\plugins aiXcoder Code Completer&#xff1a;代码补全 Bookmark-X&#xff1a;书签分类 使用方法&#xff1a;鼠标移动到某一行&#xff0c;按ALT SHIFT D

机器学习之实验过程01

import pandas as pd import numpy as np import matplotlib.pyplot as plt data_path /home/py/Work/labs/data/SD.csv # 请确保您的数据文件路径是正确的 df pd.read_csv(data_path) df.head() # 创建散点图 # 创建散点图 plt.figure(figsize(10, 6)) plt.scatter…

C语言字符串处理提取时间(ffmpeg返回的时间字符串)

【1】需求 需求&#xff1a;有一个 “00:01:33.90” 这样格式的时间字符串&#xff0c;需要将这个字符串的时间值提取打印出来&#xff08;提取时、分、秒、毫秒&#xff09;。 这个时间字符串从哪里来的&#xff1f; 是ffmpeg返回的时间&#xff0c;也就是视频的总时间。 下…

Go_defer详解

defer 1. 前言 defer语句用于延迟函数的调用&#xff0c;每次defer都会把一个函数压入栈中&#xff0c;函数返回前再把延迟的函数取出并执行。 为了方便描述&#xff0c;我们把创建defer的函数称为主函数&#xff0c;defer语句后面的函数称为延迟函数。 延迟函数可能有输入…

零基础入门网络安全必看的5本书籍(附PDF)

书中自有黄金屋&#xff0c;书中自有颜如玉。很多人学习一门技术都会看大量的书籍&#xff0c;经常也有朋友询问&#xff1a;零基础刚入门&#xff0c;应该看哪些书&#xff1f;应该怎么学&#xff1f;等等问题。今天就整理了5本零基础入门网络安全必看书籍&#xff0c;希望能帮…