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【学习笔记】的更多相关文章

  1. 韦东山视频第3课第1节_JNI_P【学习笔记】

    一.android系统java调用C方法的大概的流程图如下: 二.下面写一个JNI的程序,java的hello方法在加载native库之后能够调用C方法. 2.1 JNIDemo.java 文件内容如 ...

  2. .NET Core开发实战(第11课:文件配置提供程序)--学习笔记

    11 | 文件配置提供程序:自由选择配置的格式 文件配置提供程序 Microsoft.Extensions.Configuration.Ini Microsoft.Extensions.Configu ...

  3. 【第六课】SHELL和计划任务(学习笔记)

    4月15日学习笔记

  4. 【第三课】常用的Linux命令(学习笔记)

    4月8日 学习笔记打卡

  5. 韦东山 第9课第1节.u-boot分析之编译体验 http://www.100ask.net/index.html

    http://www.100ask.net/index.html 韦东山官网网址 http://wenku.baidu.com/view/ae78a00390c69ec3d5bb75ce.html h ...

  6. 韦东山yy公开课笔记(2)--各种杂的问题

    1. 编译器的版本和glibc库有对应关系吗,如何查看glibc的版本(glibc是linux系统中最底层的api,几乎其它任何运行库都会依赖于glibc),编译器是不是只带glibc被编译生成的 . ...

  7. 韦东山yy公开课笔记(1)--各种杂的问题

    1,第四期的智能猫眼会有打电话和发短信的功能吗?   答:会有打电话功能,硬件上支持打电话就会支持发短信,只是软件上是否实现发短信现在未定.因为短信延迟太严重,不是可靠的. 2,请问关于makefil ...

  8. 作为一个新人,怎样学习嵌入式Linux,(韦东山)

    很早以前在网上看到的韦东山老师写的文章,复制到自己的博客,方便自己以后看. 在学习嵌入式Linux之前,肯定要有C语言基础.汇编基础有没有无所谓(就那么几条汇编指令,用到了一看就会). C语言要学到什 ...

  9. (转)作为一个新人,怎样学习嵌入式Linux?(韦东山)

    被问过太多次,特写这篇文章来回答一下.   在学习嵌入式Linux之前,肯定要有C语言基础.汇编基础有没有无所谓(就那么几条汇编指令,用到了一看就会).C语言要学到什么程度呢?越熟当然越好,不熟的话也 ...

随机推荐

  1. vue路由切换时内容组件的滚动条回到顶部

    在使用vue的时候会出现切换路由的时候滚动条保持在原来的位置,要切换路由的时候滚动条回到顶部才有更好的用户体验 1.当页面整体都要滚动到顶部的情况 router.afterEach(() => ...

  2. 老生常谈之js深拷贝与浅拷贝

    前言 经常会在一些网站或博客看到"深克隆","浅克隆"这两个名词,其实这个很好理解,今天我们就在这里分析一下js深拷贝和浅拷贝. 浅拷贝 我们先以一个例子来说明 ...

  3. JavaScript 之 history对象

    location.history 对象是浏览器的一个历史对象,可以用来前进和后退. 1.back() 方法 history.back(); 浏览器的历史记录会记录原来的地址,这个方法将会返回到上一页. ...

  4. 针对源代码和检查元素不一致的网页爬虫——利用Selenium、PhantomJS、bs4爬取12306的列车途径站信息

    整个程序的核心难点在于上次豆瓣爬虫针对的是静态网页,源代码和检查元素内容相同:而在12306的查找搜索过程中,其网页发生变化(出现了查找到的数据),这个过程是动态的,使得我们在审查元素中能一一对应看到 ...

  5. Spring 创建Bean的6种方式

    前言 本文讲解了在Spring 应用中创建Bean的多种方式,包括自动创建,以及手动创建注入方式,实际开发中可以根据业务场景选择合适的方案. 方式1: 使用Spring XML方式配置,该方式用于在纯 ...

  6. 分析一个UBOOT的方法

    1. 编译完成后可以看到在主目录下生成了uboot.bin文件,为了方便分析,使用如下命令将其反汇编:arm-linux-objdump -D -m arm u-boot > u-boot.as ...

  7. 运维基础——Zabbix:Lack of free swap space on Zabbix server

    问题 使用Zabbix监控一些云主机时,可能遇到: Lack of free swap space on Zabbix server 使用命令: free -m 看到: Swap 的total,use ...

  8. JAVA 时间转换、获取

    /** * 将字符串格式的时间转换成Timestamp * * @param time * @param formatStyle * @return */ public static Timestam ...

  9. DecimalField的使用

    DecimalField类DecimalField(max_digits =无,decimal_places =无[,**选项])固定精度的十进制数,在Python中表示一个 十进制的实例.有两个必需 ...

  10. firefox修改user-agent

    让firefox对web服务器伪装成任意浏览器,找一个iphone的useragent,瞬间firefox变身iPhone有木有,一般人我不告诉他嘿嘿 1.firefox地址栏中输入about:con ...