编程开发 购物 网址 游戏 小说 歌词 快照 开发 股票 美女 新闻 笑话 | 汉字 软件 日历 阅读 下载 图书馆 编程 China
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
移动开发 架构设计 编程语言 互联网 开发经验 Web前端 开发总结
开发杂谈 系统运维 研发管理 数据库 云 计 算 Java开发
VC(MFC) Delphi VB C++(C语言) C++ Builder 其它开发语言 云计算 Java开发 .Net开发 IOS开发 Android开发 PHP语言 JavaScript
ASP语言 HTML(CSS) HTML5 Apache MSSQL数据库 Oracle数据库 PowerBuilder Informatica 其它数据库 硬件及嵌入式开发 Linux开发资料
  编程开发知识库 -> 移动开发 -> Jni 使用总结第二篇:c程序调用java -> 正文阅读
 

[移动开发]Jni 使用总结第二篇:c程序调用java[第1页]

Jni使用总结二 c程序调用java
本文属于原创,转载请声明。
前言
众所周知,Java语言是将源代码编译成class文件的,并不能直接运行,需要在虚拟机中解析之后才能运行。个人理解jni的作用就是在我们的C程序中创建虚拟机,然后将java程序加载进来运行,根据我们的需求使用类的属性和方法。
1.java 程序
我们在c函数中将会对 age属性进行设置和调用sayhello方法并传入name
代码没啥可以说的,重点在c程序。

public class Hello{
    private int age;
    public static void main(String[] args) {
        System.out.println("Hello world!");
    }

    public  int sayhello(String name){
        System.out.println("Hello world!"+name);
        System.out.println("Hello world!"+age);
        return the data from java to c;
    }
    public void sayhello(){

    }
}

2.c 程序 a.创建虚拟机
写成函数的形式在main函数中调用。重点在与使用JNI_CreateJavaVM函数创建虚拟机

jint 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);  
}  


//main
        JavaVM* jvm;
    JNIEnv* env;
    if(create_vm(&jvm,&env))
    {
        printf("create vm error\n");
        return -1;
    }

b.查找获取类
使用FindClass查找我们在c程序中要调用的类,第二个参数指定要查找的类名

jclass cls;
cls = (*env)->FindClass(env, "Hello");
if (cls == NULL) {
    printf("can not find class\n");
    ret=-1;
    goto destroy;
}

c.实例化对象
实例化对象包括以下几个小点:
i.获取构造方法ID

//获取构造方法ID
        cid = (*env)->GetMethodID(env, cls,"<init>", "()V");
    if (cid == NULL){
        ret=-1;
        printf("can not get the construction method\n");
        goto destroy;
    }

使用GetMethodID获取构造方法 :
第一个参数:环境env
第二个参数:上文查找到的类cls
第三个参数:默认<init>
第四个参数:JNI字段描述符通过命令获取

javap -p -s Hello

使用javap生成如下:Signature就是JNI字段描述符

public class Hello {
  private int age;
    Signature: I
  public Hello();
    Signature: ()V

  public static void main(java.lang.String[]);
    Signature: ([Ljava/lang/String;)V

  public int sayhello(java.lang.String);
    Signature: (Ljava/lang/String;)I

  public void sayhello();
    Signature: ()V
}

ii.创建参数
注 : 如果调用没有参数的构造方法,此步骤可忽略。
iii.获取实例化对象
使用NewObject传入环境env,要实例化的类,类的构造方法ID,返回类的实例化对象。

//获取实例化对象
    jobj= (*env)->NewObject(env, cls,cid);
    if (cid == NULL){
        ret=-1;
        printf("can not create object\n");
        goto destroy;
    } 

d.设置类的属性
上文讲到要设置类的属性age的值,需要先通过GetFieldID找到属性的ID,才能使用SetIntField进行读取或者设置。
GetFieldID的用法类似GetMethodID
SetTypeField根据属性的类型修改Type的值。

//设置类的属性
        int age;
    jfid = (*env)->GetFieldID(env, cls, "age", "I");
    if (jfid == NULL){
        ret=-1;
        printf("can not get field ID\n");
        goto destroy;
    } 
    age=22;
    (*env)->SetIntField(env, jobj, jfid, age);//env,实例化对象,属性ID,要设置的内容

e.调用方法
i.获得调用方法的ID

//获得调用方法的ID
    mid = (*env)->GetMethodID(env, cls, "sayhello","(Ljava/lang/String;)I");
    if(mid==NULL)
    {
        printf("can not get the method\n");
        goto destroy;
    }

ii.调用方法
CallTypeMethod根据Java方法的返回值类型进行修改,参数分别是:
环境env;
实例化对象;
方法ID;
参数;

//调用方法
    result = (*env)->CallIntMethod(env, jobj, mid, jstr);
    printf("%d\n",result );

总结
上面两篇文章,介绍了java程序怎么调用c/c++库的函数;c程序怎么调用java方法;主要是从简单入手,希望起到抛砖引玉的作用。但文中对数据类型的转换没有详细的介绍,只是举例。期待第三篇对着方面进行详细的介绍。分享即所得。–manjia
阅读全文
版权声明:本文为博主原创文章,未经博主允许不得转载。
本文已收录于以下专栏:

发表评论
HTML/XML objective-c Delphi Ruby PHP C# C++ JavaScript Visual Basic Python Java CSS SQL 其它
相关文章推荐
JNI开发第二篇通过反射实现C中调用java代码,并实现Log打印日志
C中调用java代码,主要运用在C代码执行耗时操作时候来进行对UI的实时性的改变,比如做图像处理的时候,可能图像较大,处理时间较长,那么就可以通过这个技术来实时更新处理的进度,下面我们通过代码来看具体...
mengxin1995 2016-09-08 19:01 738 Chap5:使用JNI技术实现java程序调用第三方dll(c/c++)文件的功能
JAVA的跨平台的特性深受java程序员们的喜爱,但正是由于它为了实现跨平台的目的,使得它和本地机器的各种内部联系变得很少,大大约束了它的功能,比如与一些硬件设备通信,往往要花费很大的精力去设计流程编...
zvivi521 2012-04-13 10:23 753 使用JNI技术实现java程序调用第三方dll(c/c++)文件的功能
JAVA的跨平台的特性深受java程序员们的喜爱,但正是由于它为了实现跨平台的目的,使得它和本地机器的各种内部联系变得很少,大大约束了它的功能,比如与一些硬件设备通信,往往要花费很大的精力去设计流程编...
cszhmrz 2014-02-24 12:49 1506 java高级编程,JNI的使用。java代码调用c程序
Java Native Interface (JNI)标准是Java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI 是本地编程接口,它使得在 Java 虚拟机 (VM) 内...
joshua_love 2016-10-19 17:28 306 JNI中在被调用的C/C++函数中如何访问Java程序中的类,并编写应用实例
1、在javah工具生成的C/C++函数声明中的JNIEnv类型参数和jobject类型参数的介绍 JNIEXPORT void JNICALL Java_jni_TestNative_sayhel...
u011955252 2015-11-06 20:45 536 Windows 7下,java jni调用C程序demo,编译器为mingw
网上看了很多的
dongms_7 2014-05-05 09:54 433 JAVA中通过JNI调用C程序实例教程
JAVA是跨平台的语言,但在有些时候还是不得不调用本地代码,而且这些代码通常是C/C++写的,比如一某个手机的项目,需要JAVA程序在发送短信的时候和第三方的短信服务器连接。短信接口是用C++写的。需...
rickiyeat 2016-09-11 11:10 707 Android开发 通过JNI实现JAVA与C/C++程序间的调用和回调
在一些Android应用的开发中,需要通过JNI和 Android NDK工具实现JAVA和C/C++之间的相互调用。        Java Native Interface (JNI)标准是jav...
xhf_123 2015-12-03 19:58 2030 本地方法(JNI)——从java 程序中调用C函数
【0】README1) 本文部分文字描述 转自 core java volume 2 , 旨在理解 本地方法——从java 程序中调用C函数 的基础知识 ; 2) for source code...
PacosonSWJTU 2016-02-01 12:58 1163 用JNI进行Java编程---从Java程序调用C/C++代码
从 Java 程序调用 C/C++ 代码 概述 当无法用 Java 语言编写整个应用程序时,JNI 允许您使用本机代码。在下列典型情况下,您可能决定使用本机代码: 希望用更低级、...
yyingwei 2013-01-08 12:12 1086
u012890170 +关注
原创 3 粉丝 1 喜欢 0 码云  
他的最新文章 更多文章
通过HDMI获取显示器EDID数据
在线课程

【免费】搜狗机器翻译技术分享
讲师:

深度学习在推荐领域的应用和实践
讲师:吴岸城
热门文章 通过HDMI获取显示器EDID数据
137
Jni 使用总结第一篇:java调用c库
7
0
  移动开发 最新文章
Android设计模式之——状态模式
Android解决ScrollView默认不从顶部显示
关于在QtChart中绘出的图形进行点选的问题
Android Studio入门阶段的山路弯弯之Androi
Android设计模式之——责任链模式
DialogFragment实现自定义布局的小技巧
基于局部flush和全屏flush
android 使用binder实现Service与activity进
android性能优化实战理论篇
jenkins+maven+svn实现简单的一键发布
上一篇文章           查看所有文章
加:2017-10-29 21:47:03  更:2017-10-29 21:49:09 
VC(MFC) Delphi VB C++(C语言) C++ Builder 其它开发语言 云计算 Java开发 .Net开发 IOS开发 Android开发 PHP语言 JavaScript
ASP语言 HTML(CSS) HTML5 Apache MSSQL数据库 Oracle数据库 PowerBuilder Informatica 其它数据库 硬件及嵌入式开发 Linux开发资料
360图书馆 软件开发资料 文字转语音 购物精选 软件下载 新闻资讯 小游戏 Chinese Culture 股票 三丰软件 开发 中国文化 网文精选 阅读网 看图 日历 万年历 2018年10日历
2018-10-19 0:39:22
多播视频美女直播
↓电视,电影,美女直播,迅雷资源↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  编程开发知识库