韦东山视频第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语言要学到什么程度呢?越熟当然越好,不熟的话也 ...
随机推荐
- JavaScript 之 navigator 对象
navigator 对象可以查看用户所使用的浏览器类型和系统平台类型. 1.userAgent 通过 userAgent 可以判断用户浏览器的类型. Chrome 浏览器效果: 2.platform ...
- iOS RACSubject代替通知
RAC是一个很常用并且很好用的插件,简洁的调用方式可以代替很多原生方法,下面是RACSubject代替通知的使用方式: #import <UIKit/UIKit.h> #import &l ...
- SAP技术 - How to create a CDS redirect view for a given database table
Scenario Suppose we have a database table A, and then we create a CDS redirect view B for it, then e ...
- 微服务spring-cloud 学习第一天
了解微服务 微服务架构风格是一种将单一应用程序开发为一组小型服务的方法,每个服务运行在自己的进程中,服务间通信采用轻量级通信机制(通常使用HTTP).这些服务围绕业务能力构建并且可通过自动部署 ...
- k8s的常用命令(一)
常用的kubectl命令 kubectl run kubia --image=luksa/kubia --port=8080 --generator=run/v1 --image 指定镜像 - ...
- layui 自定义字体图标 扩展
layui的图标取自于阿里巴巴的矢量图标库 Iconfont,同样的,这篇教程也是基于Iconfont进行扩展. 第一步,通过浏览器打开 http://iconfont.cn/ ,访问阿里巴巴矢量图标 ...
- 联想ideapad-330C 在Ubuntu18.04 上安装Realtek 8821CE无线网卡驱动
在新买的联想ideapad-330C笔记本上,安装Ubuntu 18.04后,悲催的发现,没有无线网络,幸好有线还能用,然后网上搜一波,发现不少人遇到这种问题,也有人给出解决方案 参考的链接: Thi ...
- Flask基础之session验证与模板渲染语法(jinja2)
目录 1.http传输请求头参数 2.Flask中request.data参数处理 3.Flask中request.json参数 4.Flask中的session管理 5.Flask中模板语法(if, ...
- SAMBA配置文件详解
全局参数: ==================Global Settings =================== [global] config file = /usr/local/samba/ ...
- MGR基本使用(转)
第一章:MGR介绍 MGR(MySQL Group Replication)是一个MySQL Server插件,可用于创建弹性,高可用MySQL集群方案.有一个内置的组成员服务,在任何给定的时间点,保 ...