c 语言调用java_C语言调用java的方法
C语言调用java的方法
发布时间:2020-07-01 11:01:25
来源:亿速云
阅读:86
作者:Leah
本篇文章为大家展示了C语言调用java的方法,代码简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
步骤:
1. 创建虚拟机;
2. 获得class;
3. 实例化对象:获得构造方法(方法名为“”),构造参数,调用方法。
4. 调用方法:又分为获得方法,构造方法,调用方法。
操作方法:
1. 编译:javac Hello.java
2. javap -p -s Hello.class:查看Signature
3. gcc -I/usr/lib/jvm/java-1.8.0-openjdk-amd64/include/ -I/usr/lib/jvm/java-1.8.0-openjdk-amd64/include/linux/ -o caller caller.c -L /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/amd64/server -ljvm
4. 执行:LD_LIBRARY_PATH=/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/amd64/server ./caller
举例:
(1)call_static_method#include
#include
JNIEnv* create_vm(JavaVM** jvm, JNIEnv** env)
{
JavaVMInitArgs args;
JavaVMOption options[1];
args.version = JNI_VERSION_1_6;
args.nOptions = 1;
options[0].optionString = "-Djava.class.path=./";
args.options = options;
args.ignoreUnrecognized = JNI_FALSE;
return JNI_CreateJavaVM(jvm, (void **)env, &args);
}
int main(int argc, char **argv)
{
JavaVM* jvm;
JNIEnv* env;
jclass cls;
int ret = 0;
jmethodID mid;
/* 1. create java virtual machine */
if(create_vm(&jvm, &env))
{
printf("can not create jvm\n");
return -1;
}
/* 2. get class */
cls = (*env)->FindClass(env, "Hello");
if(cls == NULL)
{
printf("can not find hello class\n");
ret = -1;
goto destory;
}
/* 3. create object */
/* 4. call method
* 4.1 get method
* 4.2 create parameter
* 4.3 call method
*/
mid = (*env)->GetStaticMethodID(env, cls, "main", "([Ljava/lang/String;)V");
if(mid == NULL)
{
ret = -1;
printf("can not get method\n");
goto destory;
}
(*env)->CallStaticVoidMethod(env, cls, mid, NULL);
destory:
(*jvm)->DestroyJavaVM(jvm);
return ret;
}
(2)call_non_static_method#include
#include
JNIEnv* create_vm(JavaVM** jvm, JNIEnv** env)
{
JavaVMInitArgs args;
JavaVMOption options[1];
args.version = JNI_VERSION_1_6;
args.nOptions = 1;
options[0].optionString = "-Djava.class.path=./";
args.options = options;
args.ignoreUnrecognized = JNI_FALSE;
return JNI_CreateJavaVM(jvm, (void **)env, &args);
}
int main(int argc, char **argv)
{
JavaVM* jvm;
JNIEnv* env;
jclass cls;
int ret = 0;
jmethodID mid;
jmethodID cid;
jobject jobj;
jstring jstr;
int r;
/* 1. create java virtual machine */
if(create_vm(&jvm, &env))
{
printf("can not create jvm\n");
return -1;
}
/* 2. get class */
cls = (*env)->FindClass(env, "Hello");
if(cls == NULL)
{
printf("can not find hello class\n");
ret = -1;
goto destory;
}
/* 3. create object
*
*/
cid = (*env)->GetMethodID(env, cls, "", "()V");
if(cid == NULL)
{
printf("can not get construct method\n");
ret = -1;
goto destory;
}
jobj = (*env)->NewObject(env, cls, cid);
if(jobj == NULL)
{
printf("can not create object\n");
ret = -1;
goto destory;
}
/* 4. call method
* 4.1 get method
* 4.2 create parameter
* 4.3 call method
*/
mid = (*env)->GetMethodID(env, cls, "sayhello_to", "(Ljava/lang/String;)I");
if(mid == NULL)
{
ret = -1;
printf("can not get method\n");
goto destory;
}
jstr = (*env)->NewStringUTF(env, "287787472@qq.com");
r = (*env)->CallIntMethod(env, jobj, mid, jstr);
printf("ret = %d\n", r);
destory:
(*jvm)->DestroyJavaVM(jvm);
return ret;
}
上述内容就是C语言调用java的方法,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注亿速云行业资讯频道。
c 语言调用java_C语言调用java的方法相关推荐
- c语言 python java_C语言、C++、Java,Python之间的区别,哪个更有前景,哪个更难 ?...
从这四种语言的难度.受欢迎度还有作用以及优点缺点给楼主做一个全面的分析,我们可以从中了解其区别,以及难易程度.至于今后可以用到的或者是前景问题,根据自己的职业发展大家可以自己做个分析.最后会总结一下他 ...
- Java学习之路3——方法定义、调用【重拾Java】
Java学习之路3--方法定义.调用[重拾Java] 方法定义 为什么要写方法 方法完整的定义形式.调用 方法定义的格式 修饰符 返回值类型 返回值 调用格式 方法重载 方法定义 为什么要写方法 对于 ...
- JAVA调用R语言之Rserve(二)
之前,我写了一篇文章是java调用R语言之Rserve,但我发现那种方法比较麻烦.后来我发现了一个比较方便的方法,所以今天从又写了一篇博客,来简单说说. 这次我们需要写一个简单的R语言脚本,然后通过运 ...
- JAVA调用R语言之Rserve
为什么要用java调用R? Java作为一个非常流行的编程语言,具有功能强大和简单易用两个特征.Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂 ...
- R语言实战应用精讲50篇(十三)-如何使用JAVA调用R语言,两种语言的完美结合
前言 为什么要用java调用R? Java作为一个非常流行的编程语言,具有功能强大和简单易用两个特征.Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进 ...
- java调用siri 语言_如何更改Siri的声音,口音,性别和语言
java调用siri 语言 Most of us are familiar with Siri as an American female voice. What you may not realiz ...
- java JNI调用C语言动态链接库(java.lang.UnsatisfiedLinkError: no yourClassName in java.library.path 异常的解决方法)
转自: http://watershitter.iteye.com/blog/477615 今天花了至少3个小时跑这个java调c的动态链接库的Hello,native world的程序. 把所有犯 ...
- JAVA调用C语言程序
JAVA调用C语言程序 JAVA调用C语言程序 1. 编写带有native声明的方法的Java类 2. 使用javah 生成:jniSample.h的头文件 3. 使用C实现本地sum方法:(这里我生 ...
- JAVA中native方法调用C语言实现学习
在java虚拟机规范的内存管理划分中,对于虚拟机内存空间划分中专门划了一块内存叫做"本地方法栈(Native Method Stack)".本地方法栈是为了java专门用来调用na ...
最新文章
- 【linux】可执行程序执行时报错-sh: ./mxc_v4l2_tvin.out: No such file or directory的解决方法
- 一级域名和二级域名的区别是什么?作用怎样?
- 如何在Eclipse中使用tomcat9 运行servlet开发简单的动态网页?
- RMAN深入解析之--控制文件
- 阿里巴巴研究员叔同:云原生是企业数字创新的最短路径
- wp如何代码实现锁屏
- 【PAT甲级 BigInteger】1019 General Palindromic Number (20 分) Java版 7/7通过
- mysql与jframe_java-如何在JFrame上显示从mysql检索到的图像
- 网络通道数2的倍数_限流笔记-通道限流(二)
- java 图像梯度检测_数字图像处理-边缘检测
- SQL 审核系统体验
- java质因数算法_Java实现的质因数分解操作示例【基于递归算法】
- 12.1、自定义Condition
- Uber宣布停止无人卡车项目,研发重心将转向无人小汽车
- 思科网络设备模拟器GNS3与SecureCRT关联
- Mina(1):快速上手
- oracle查询语句大全 oracle 基本命令大全
- 微信中那些你不知道的隐藏实用功能!
- 自我规定int string char[]
- 关于数据库可变长字符串类型长度设计问题:慷慨是不明智的