C调JAVA方法主要步骤如下:
一、C代码调用java的静态方法
Hello.java
public class Hello{
public static void main(String args[]){
System.out.println("Hello World!");
} public static void sayhello_to(String name){ } public static void sayhello_to(){ } }
caller.c
#include <stdio.h>
#include <jni.h> jint create_vm(JavaVM** jvm, JNIEnv** env)
{
JavaVMInitArgs args;
JavaVMOption options[];
args.version = JNI_VERSION_1_6;
args.nOptions = ;
options[].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 = ; jmethodID mid; if (create_vm(&jvm, &env)) {
printf("can not create jvm\n");
return -;
} cls = (*env)->FindClass(env, "Hello");
if (cls == NULL) {
printf("can not find hello class\n");
ret = -;
goto destroy;
} mid = (*env)->GetStaticMethodID(env, cls, "main","([Ljava/lang/String;)V");
if (mid == NULL) {
ret = -;
printf("can not get method\n");
goto destroy;
} (*env)->CallStaticVoidMethod(env, cls, mid, NULL); destroy: (*jvm)->DestroyJavaVM(jvm);
return ret;
}
编译运行命令:
javac Hello.java javap -p -s Hello.class gcc -I/usr/lib/jvm/java-1.7.-openjdk-amd64/include/ -o caller caller.c -L /usr/lib/jvm/java--openjdk-amd64/jre/lib/amd64/server -ljvm LD_LIBRARY_PATH=/usr/lib/jvm/java--openjdk-amd64/jre/lib/amd64/server ./caller
二、C调java非静态方法
Hello.java
public class Hello{
public static void main(String args[]){
System.out.println("Hello World!");
} public int sayhello_to(String name){
System.out.println("java Hello World! " + name);
return ;
} public static void sayhello_to(){ } }
caller.c
#include <stdio.h>
#include <jni.h> jint create_vm(JavaVM** jvm, JNIEnv** env)
{
JavaVMInitArgs args;
JavaVMOption options[];
args.version = JNI_VERSION_1_6;
args.nOptions = ;
options[].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 = ; jmethodID mid;
jmethodID cid; jobject jobj;
jstring jstr; int r; if (create_vm(&jvm, &env)) {
printf("can not create jvm\n");
return -;
} cls = (*env)->FindClass(env, "Hello");
if (cls == NULL) {
printf("can not find hello class\n");
ret = -;
goto destroy;
} cid = (*env)->GetMethodID(env, cls, "<init>", "()V");
if (cid == NULL) {
ret = -;
printf("can not get constructor method");
goto destroy;
} jobj = (*env)->NewObject(env, cls, cid);
if (jobj == NULL) {
ret = -;
printf("can not create object");
goto destroy;
} mid = (*env)->GetMethodID(env, cls, "sayhello_to","(Ljava/lang/String;)I");
if (mid == NULL) {
ret = -;
printf("can not get method\n");
goto destroy;
} jstr = (*env)->NewStringUTF(env, "weidongshan@qq.com"); r = (*env)->CallIntMethod(env, jobj, mid, jstr);
printf("jni ret = %d\n", r); destroy: (*jvm)->DestroyJavaVM(jvm);
return ret;
}
运行结果:
二、C调java非静态方法,并设置属性
Hello.java
public class Hello{
private String name;
private int age; public static void main(String args[]){
System.out.println("Hello World!");
} public int sayhello_to(String name){
System.out.println("java Hello , " + name + " I'm " + this.name + "," + age+"years old");
return 123;
} public static void sayhello_to(){ } }
caller.c
#include <stdio.h>
#include <jni.h> jint create_vm(JavaVM** jvm, JNIEnv** env)
{
JavaVMInitArgs args;
JavaVMOption options[];
args.version = JNI_VERSION_1_6;
args.nOptions = ;
options[].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 = ; jmethodID mid;
jmethodID cid; jobject jobj;
jstring jstr; jfieldID nameID;
jfieldID ageID; int r; if (create_vm(&jvm, &env)) {
printf("can not create jvm\n");
return -;
} cls = (*env)->FindClass(env, "Hello");
if (cls == NULL) {
printf("can not find hello class\n");
ret = -;
goto destroy;
} cid = (*env)->GetMethodID(env, cls, "<init>", "()V");
if (cid == NULL) {
ret = -;
printf("can not get constructor method");
goto destroy;
} jobj = (*env)->NewObject(env, cls, cid);
if (jobj == NULL) {
ret = -;
printf("can not create object");
goto destroy;
} nameID = (*env)->GetFieldID(env, cls, "name", "Ljava/lang/String;");
if (nameID == NULL) {
ret = -;
printf("can not get field name");
goto destroy;
}
jstr = (*env)->NewStringUTF(env, "Bill");
(*env)->SetObjectField(env, jobj, nameID, jstr); ageID = (*env)->GetFieldID(env, cls, "age", "I");
if (ageID == NULL) {
ret = -;
printf("can not get field age");
goto destroy;
}
(*env)->SetIntField(env, jobj, ageID, ); mid = (*env)->GetMethodID(env, cls, "sayhello_to","(Ljava/lang/String;)I");
if (mid == NULL) {
ret = -;
printf("can not get method\n");
goto destroy;
} jstr = (*env)->NewStringUTF(env, "weidongshan@qq.com"); r = (*env)->CallIntMethod(env, jobj, mid, jstr);
printf("ret = %d\n", r); destroy: (*jvm)->DestroyJavaVM(jvm);
return ret;
}
运行结果:
相关代码可以在这里下载:
https://github.com/zzb2760715357/100ask/tree/master/java
韦东山视频第3课第2节_JNI_C调用JAVA_P【学习笔记】的更多相关文章
-
韦东山视频第3课第1节_JNI_P【学习笔记】
一.android系统java调用C方法的大概的流程图如下: 二.下面写一个JNI的程序,java的hello方法在加载native库之后能够调用C方法. 2.1 JNIDemo.java 文件内容如 ...
-
.NET Core开发实战(第11课:文件配置提供程序)--学习笔记
11 | 文件配置提供程序:*选择配置的格式 文件配置提供程序 Microsoft.Extensions.Configuration.Ini Microsoft.Extensions.Configu ...
-
韦东山 第9课第1节.u-boot分析之编译体验 http://www.100ask.net/index.html
http://www.100ask.net/index.html 韦东山官网网址 http://wenku.baidu.com/view/ae78a00390c69ec3d5bb75ce.html h ...
-
韦东山yy公开课笔记(2)--各种杂的问题
1. 编译器的版本和glibc库有对应关系吗,如何查看glibc的版本(glibc是linux系统中最底层的api,几乎其它任何运行库都会依赖于glibc),编译器是不是只带glibc被编译生成的 . ...
-
韦东山yy公开课笔记(1)--各种杂的问题
1,第四期的智能猫眼会有打电话和发短信的功能吗? 答:会有打电话功能,硬件上支持打电话就会支持发短信,只是软件上是否实现发短信现在未定.因为短信延迟太严重,不是可靠的. 2,请问关于makefil ...
-
作为一个新人,怎样学习嵌入式Linux,(韦东山)
很早以前在网上看到的韦东山老师写的文章,复制到自己的博客,方便自己以后看. 在学习嵌入式Linux之前,肯定要有C语言基础.汇编基础有没有无所谓(就那么几条汇编指令,用到了一看就会). C语言要学到什 ...
-
(转)作为一个新人,怎样学习嵌入式Linux?(韦东山)
被问过太多次,特写这篇文章来回答一下. 在学习嵌入式Linux之前,肯定要有C语言基础.汇编基础有没有无所谓(就那么几条汇编指令,用到了一看就会).C语言要学到什么程度呢?越熟当然越好,不熟的话也 ...
-
作为一个新人,怎样学习嵌入式Linux?(韦东山)
这篇文章是引用韦老师的部分关于新人怎么学习嵌入式Linux的经验,引用如下: 1.电脑一开机,那些界面是谁显示的?是BIOS,它做什么?一些自检,然后从硬盘上读入windows,并启动它. 类似的, ...
-
专访Linux嵌入式开发韦东山操作系统图书作者--转
CSDN学院讲师韦东山:悦己之作,方能悦人 发表于2015-04-28 08:09| 6669次阅读| 来源CSDN| 24 条评论| 作者夏梦竹 专访Linux嵌入式开发韦东山操作系统图书作者 摘要 ...
随机推荐
-
导入 sun.net.TelnetInputStream; 报错
// 对于导入 sun.net.TelnetInputStream; 报错 是权限不足 myeclise 默认不是使用sun 下面的额工具类 也可以自己建立一个 TelnetInputStream 继 ...
-
HDU 1941 Hide and Seek(离散化+树状数组)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1941 题意:给出平面上n个点,找出一点p,使得距离p最近和最远的点的距离之差最小.输出这 ...
-
mysql 查看表的类型
MySQL 数据表主要支持六种类型 ,分别是:BDB.HEAP.ISAM.MERGE.MYISAM.InnoBDB. 这六种又分为两类,一类是”事务安全型”(transaction-safe),包括B ...
-
[LeetCode] 76. Minimum Window Substring 解题思路
Given a string S and a string T, find the minimum window in S which will contain all the characters ...
-
移动平台前端开发总结(针对iphone,Android等手机)
移动平台前端开发是指针对高端智能手机(如Iphone.Android)做站点适配也就是WebApp,并非是针对普通手机开发Wap 2.0,所以在阅读本篇文章以前,你需要对webkit内核的浏览器有一定 ...
-
[工作总结] QA小鸟一年了
夏至又至,在北京360的一年过去了.作为一名QA,我时常感到迷惑,如何靠大部分的手工测试+少部分的自动化测试来保证产品功能的质量.对于开发完成后,给到我手上的文件和功能说明,我很少有信心说能够通过自己 ...
-
004.etcd集群部署-动态发现
一 etcd发现简介 1.1 需求背景 在实际环境中,集群成员的ip可能不会提前知道.如使用dhcp自动获取的情况,在这些情况下,使用自动发现来引导etcdetcd集群,而不是指定静态配置,这个过程被 ...
-
HDU1370(中国剩余定理)
昨天我细致一想,发现自己之前的分类(用OJ来划分,毫无意义啊.)太失败了,所以我又一次划分了一下大分类,在分到数论的时候,我就想起了中国剩余定理了.于是乎今天就刷了一题中国剩余定理的题目了.话说太久没 ...
-
android stuido - 关闭单词拼写检查
"File"-"Settings"-"Editor "-"Inspections" 在Spelling栏取消选中,再点击 ...
-
zabbix 报警方式之 邮件报警(4)
一.为什么要自定义邮件脚本报警? 灵活,方便.可以自定义过滤信息. 下面是使用不同方式的邮件报警,一个是利用sendEmail程序来发送报警邮件,第二个是利用python脚本来发送邮件. 二.send ...