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博客

五.注意事项

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

javac JavaTest.java

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

javap -classpath ./ -s JavaTest

六.源代码下载

下载源代码

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

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

相关文章

MFC串口通信设置及发送、中断接收程序

前一段做了个串口通信小软件&#xff0c;就是现实利用上位机软件通过串口通信对下位机&#xff08;单片机&#xff09;通信&#xff0c;校时LED点阵万年历&#xff0c;省去按键调节的麻烦&#xff0c;方便校时&#xff0c;省时省力。 为右击 串口通信控件&#xff0c;添加关联…

ReactNative开发工具有这一篇足矣

ReactNative系列文章&#xff1a; 1.《逻辑性最强的React Native环境搭建与调试》 2.《ReactNative开发工具有这一篇足矣》 正文 React Native&#xff08;以下简称RN&#xff09;开发工具的文章很多&#xff0c;几乎千篇一律都是Copy的&#xff08;一毛一样&#xff09;&a…

【K8S】Docker向私有仓库拉取/推送镜像报错(http: server gave HTTP response to HTTPS client)

这里&#xff0c;我们搭建的Harbor仓库的地址为 http://192.168.175.101:1180。 报错信息如下所示。 [rootbinghe101 ~]# docker login 192.168.175.101:1180 Username: binghe Password: Error response from daemon: Get https://192.168.175.101:1180/v2/: http: server …

MFC串口通信串口指示灯的实现

前一段做了个串口通信小软件&#xff0c;当打开串口时串口指示灯亮&#xff0c;关闭串口时串口指示灯灭&#xff0c;实现方法如下&#xff1a; 1.在资源视图中&#xff0c;添加两个图标&#xff0c;分别为串口指示灯灭IDI_ICON1&#xff0c;串口指示灯亮IDI_ICON2。 2.在串口通…

07-Windows Server 2012 R2 会话远程桌面-标准部署-RD授权

Windows Server 2012 R2 会话远程桌面-标准部署-RD授权马博峰当完成所有的部署后&#xff0c;在实际操作中没有任何问题&#xff0c;并完成所有的测试&#xff0c;在所有工作的最后一步就是需要安装RD授权服务器&#xff0c;远程桌面授权&#xff08;RD 授权&#xff09;以前称…

解决React Native unable to load script from assets index.android.bundle on windows

React Native运行的时候&#xff0c;经常碰到React Native unable to load script from assets index.android.bundle on windows解决方法有2种&#xff1a; 方法一&#xff1a;设置IP和端口 具体步骤&#xff1a;报错页面晃动手机&#xff0c;显示菜单 》 点击Dev Settings …

CentOS 安装go client调用Kubernetes API

CentOS 安装 Go环境并配置goproxy wget https://dl.google.com/go/go1.14.4.linux-amd64.tar.gz tar -xzvf go1.14.4.linux-amd64.tar.gz -C /usr/local/ mkdir -p /home/gopath cat >> /etc/profile <<EOF export GOROOT/usr/local/go export GOPATH/home/gopath…

VS2010中使用sprintf出现warning C4997: 'sprintf': This function or variable may be unsafe.

使用VS2010编译时。会出现以下警告。 warning C4997: sprintf: This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. c:\program files (x86)\microsoft visual …

list使用

1、将两个list合并成一个list&#xff0c;可以用addAll()方法。2、一个list1嵌套list&#xff0c;可以list<bean> listnew ArrayList<bean>();ArrayList<list> list1new ArrayList<list>();lst1.add(list);转载于:https://blog.51cto.com/7533390/1341…

React Native App设置amp;Android版发布

React Native系列 《逻辑性最强的React Native环境搭建与调试》 《ReactNative开发工具有这一篇足矣》 《解决React Native unable to load script from assets index.android.bundle on windows》 《React Native App设置&Android版发布》 一、设置APP信息 1.设置包名…

Kubernetes 1.20 报错:“open /run/flannel/subnet.env: no such file or directory“

pod 一直处于 ContainerCreating&#xff0c;查看 pod 详情&#xff1a; kubectl describe pod [pod name]提示错误信息&#xff1a; ... NetworkPlugin cni failed to set up pod "mysql-mb6t7_default" network: open /run/flannel/subnet.env: no such file or …

史上最易懂——ReactNative分组列表SectionList使用详情及示例详解

React Native系列 《逻辑性最强的React Native环境搭建与调试》 《ReactNative开发工具有这一篇足矣》 《解决React Native unable to load script from assets index.android.bundle on windows》 《React Native App设置&Android版发布》 《史上最易懂——ReactN…

tomcat 系统服务 outofmemory

TOMCAT内存溢出outofmemory的问题&#xff1a; http://hi.baidu.com/mefeng47/item/3b247af74ce4e24e922af2e5 注&#xff1a;双击tomcat6w.exe打开tomcat monitor 1.OutOfMemoryError: Java heap space 堆溢出 VM参数&#xff1a;-Xms256m -Xmx512m 2.OutOfMemoryError: PermG…

Jeston TX2安装Ubuntu系统

准备材料&#xff1a;一台装有Ubuntu系统的电脑&#xff0c;联网的路由器&#xff0c;网线&#xff08;这里用了两根&#xff09;&#xff0c;一根普通安卓手机充电线 我的电脑系统是Ubuntu16.04&#xff0c;尝试了在Ubuntu18.01上面运行下面的命令&#xff0c;不能运行&#x…

VS2010 error C299: “Font”:“struct”类型重定义

在VS2010里添加了在VC6.0里形成的OFFICE库文件的类 excel9.h,excel9.cpp&#xff0c;就是我在VC6里做操作OFFICE的表格时候添加的库文件&#xff0c;然后把它们&#xff08; excel9.h,excel9.cpp&#xff09;加载VS2010里&#xff0c;然后就报很多的错误。下面的错误只是一部分…

ReactNative环境搭建扩展篇——安装后报错解决方案

之前一篇写了《逻辑性最强的React Native环境搭建与调试》说了RN的安装&#xff0c;今天在这里做一个复盘&#xff0c;让我们能够更直观更深入的了解React Native&#xff08;以下简称RN&#xff09;,这一篇重点来说的就是&#xff0c;安装之后必报的2个错误的解决方案。 更新…

TensorFlow实战——深度学习训练个性化推荐系统

请安装TensorFlow1.0&#xff0c;Python3.5 项目地址&#xff1a;GitHub - xiaobingchan/movie_recommender: MovieLens based recommender system.使用MovieLens数据集训练的电影推荐系统。 前言 本项目使用文本卷积神经网络&#xff0c;并使用MovieLens数据集完成电影推荐的…

Ubuntu开发环境配置--- 安装chrome浏览器

Ubuntu开发环境配置--- 安装chrome浏览器 版权声明&#xff1a;本文为博主原创文章&#xff0c;遵循 CC 4.0 BY-SA 版权协议&#xff0c;转载请附上原文出处链接和本声明。 本文链接&#xff1a;https://blog.csdn.net/idomyway/article/details/81986062 前言 Ubantu中自带了…

java中的匿名内部类总结

匿名内部类也就是没有名字的内部类正因为没有名字&#xff0c;所以匿名内部类只能使用一次&#xff0c;它通常用来简化代码编写但使用匿名内部类还有个前提条件&#xff1a;必须继承一个父类或实现一个接口实例1:不使用匿名内部类来实现抽象方法12345678910111213141516abstrac…

Xamarin使用ListView开启分组视图Cell数据展示bug处理

问题描述 Xamarin使用IsGroupingEnabled"true"之后再Cell操作就会出现数据展示bug&#xff0c;数据不刷新的问题&#xff0c;如下图所示&#xff1a; 点击取消的是其他钢厂&#xff0c;但ViewCell展示的一直是“长峰”&#xff0c;这就分组试图一个比较常见的bug。 …