韦东山视频第3课第2节_JNI_C调用JAVA_P【学习笔记】
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 ...
- 【第六课】SHELL和计划任务(学习笔记)
4月15日学习笔记
- 【第三课】常用的Linux命令(学习笔记)
4月8日 学习笔记打卡
- 韦东山 第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语言要学到什么程度呢?越熟当然越好,不熟的话也 ...
随机推荐
- 网址URL分解
http://www.joymood.cn:8080/test.php?user=admin&pwd=admin#login 1.location.href:得到整个如上的完整url 2.lo ...
- Web消息推送框架windows部署实践
一.官方下载地址:https://www.workerman.net/web-sender 二.解压至任意目录下,双击start_for_win.bat,效果如下图: 三.打开Chrome浏览器访问: ...
- JavaScript 流程控制(二)循环结构
一.while 语句 语法结构: 声明循环变量:while (循环条件) { //循环体 // 迭代条件 } 当循环条件为 true 时,执行循环体:当循环条件为false时,结束循环. 二.do.. ...
- The Vertu of the Dyamaund钻石
dyamaund and the English words dyamaund The Vertu of the Dyamaund": Gemstones, Knowledge and Va ...
- (三)MongoDB增、删、改、查
(三)MongoDB增.删.改.查 mongodb 2018年03月07日 09时31分40秒 插入基础 查询 基础查询find().findOne() 指定返回的字段 关系查询 逻辑运算 复杂数据的 ...
- PyCharm专业版激活(2018年Windows版)
友情提示: 本教程仅供学习交流使用,如需商业用途,强烈建议使用官方正式版.(官网正式链接为:https://www.jetbrains.com/pycharm/) 当然网上有很多其他激活教程,我看到的 ...
- FTPClient中使用completePendingCommand方法注意事项
方法介绍: * There are a few FTPClient methods that do not complete the * entire sequence of FTP commands ...
- Win10上的Docker应用:Docker-compose(容器编排)
阅读目录: Docker应用:Hello World Docker应用:Docker-compose(容器编排) 前言: 昨天完成了Docker入门示例(Docker应用:Hello World),示 ...
- 【PHP】系统部署
1.MySql数据库,单独创建用户和数据库 使用MySql-Front导入,避免使用Navicat导入 2.httpd-vhosts.conf配置 文件位于:D:\Xampp\apache\conf\ ...
- C语言中一个语句太长用什么换行?
C语言中一个语句太长用什么换行? 5 C语言中一个语句太长用什么换行?比如我有一个printf语句很长很长,问了美观,我不想写在这一行了,要换到下一行,是不是在这行结尾的时候,要用个什么标识来表 ...