- 浏览: 844992 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (379)
- struts (5)
- hibernate (16)
- spring (16)
- ssh (20)
- MySQL (16)
- 数据库脚本 (2)
- DownLoad (1)
- GAE (5)
- Java (103)
- LoadRunner (2)
- VF (1)
- 学习资料 (24)
- 软件使用 (21)
- 通信类 (4)
- 生活 (3)
- J2ME (1)
- 心理学 (1)
- Linux (26)
- Android (3)
- Oracle (1)
- 面向对象概念&面试准备 (11)
- ExtJs (2)
- Google Map (1)
- Flex (47)
- 算法研究 (1)
- share (20)
- python (1)
- MongoDB (7)
- centos6 (13)
- C++ (8)
- DB2 (3)
- C# (1)
- 代码片段 (24)
- Lucene (2)
- php (1)
- NodeJS (1)
- Express (1)
最新评论
-
shua1991:
已阅,我表示同意。
Eclipse统计代码行数 -
nakedou:
写的不错,挺详细的
在CentOS中使用 yum 安装MongoDB及服务器端配置 -
sjp524617477:
好方法
Eclipse统计代码行数 -
simpletrc:
<script>ale ...
Java写到.txt文件,如何实现换行 -
csdn_zuoqiang:
Apache Ftp Server,目前是1.0.4,非常好的 ...
Apache FtpServer在64位系统下服务不能启动解决方法
最近作一个tiemsten数据库的项目,用到了jni技术。在这个项目中,我们用java来写界面和业务逻辑,用c语言写数据库odbc访问。单 纯的odbc其实没有什么难的,但是在java和c之间进行数据传递是比较麻烦的事情。两者之间数据的传递有这样几种情况:java和c之间基本数据类型 的交互,java向c传递对象类型,c向java返回对象类型,c调用java类。下面就这样几种情况分类说明。
1、java 向c传递基本数据类型
对于基本数据类型,java和c是相互对应的,所以可以直接使用。它们的对应关系为;
------------------------------------------------------------------------
Java类型 本地类型 字节(bit)
-------------------------------------------------------------------------
boolean jboolean 8, unsigned
byte jbyte 8
char jchar 16, unsigned
short jshort 16
int jint 32
long jlong 64
float jfloat 32
double jdouble 64
void void n/a
------------------------------------------------------------------------
2.java向c传递对象类型
对于java传递进来的java对象模型,c要加载java类的原型,根据创建相应的c对象,获取java对象的方法的id,然后调用java对象 的方法。举例说明:比如有个java类customer对象作为jni参数传递到c程序,customer有方法String getName()。
JNIEXPORT jobject JNICALL Java_com_oracle_estt_sc_db_impl_SCQueryODBC__1getCustomer
(JNIEnv *env, jobject, jobject customer){
jmethodID methodId;
//获得customer对象的句柄
jclass cls_objClass=env->GetObjectClass(customer);
//获得customer对象中特定方法getName的id
methodId=env->GetMethodID(cls_objClass,"getName","()Ljava/lang/String;");
//调用customer对象的特定方法getName
jstring js_name=(jstring)env->CallObjectMethod(customer,methodId,NULL);
...
}
3.c向java返回对象类型
在c程序中首先要创建要返回的java对象,得到每个属性的id,然后给每个属性赋值,最后返回。举例说明:同样是customer对象,有name等属性值,需要在c程序中给每个属性赋值后返回。
JNIEXPORT jobject JNICALL Java_com_oracle_estt_sc_db_impl_SCQueryODBC__1getCustomer
(JNIEnv *env, jobject, jobject customer){
......
//发现java Customer类,如果失败,程序返回
jclass clazz = env->FindClass("com/oracle/estt/sc/busi/Customer");
if(clazz == 0)
return 0;
//为新的java类对象obj分配内存
jobject obj = env->AllocObject(clazz);
//发现类中的属性,如果失败,程序返回
jfieldID fid_id = env->GetFieldID(clazz,"customerID","I");
if (fid_id == 0)
return 0;
jfieldID fid_name = env->GetFieldID(clazz,"name","Ljava/lang/String;");
if (fid_name == 0)
return 0;
......
env->SetIntField(obj, fid_id, 1);
env->SetObjectField(obj, fid_name, jname);
......
return obj;
}
4.c向java传递一个含有java对象的数组
对于这种情况,先得到数组的大小,接下来取出数组中的对象,取得对象的属性值或者调用对象的方法,将获得值存到本地数组中,然后可以灵活使用这些数 据了。举例说明:java向c传递一个含有多个customer对象的数组,在c中将这个数组的分解出来,存到本地的临时数组中去。
JNIEXPORT void JNICALL
Java_com_oracle_estt_sc_db_impl_SCInsertODBC__1insertCustomeRequest___3Lcom_oracle_estt_sc_busi_CustomerRequest_2
(JNIEnv *env, jobject, jobjectArray oa){
......
//声明customerrequest对象
jobject o_customer;
int i;
jmethodID methodId;
jint size=env->GetArrayLength(oa);
_tmp_bind[0]= (char *)malloc(size*sizeof(int));
_tmp_bind[1]= (char *)malloc(size*sizeof(char)*( 20 + 1));
...
//将输入数组的数据拷贝到临时数组中去
for(i=0;i<size;i++){
//从数组中获得customerrequest对象
o_request=env->GetObjectArrayElement(oa,i);
//获得customerrequest对象的句柄
jclass cls_objClass=env->GetObjectClass(o_request);
//获得customerrequest对象的特定方法getCustomerID的id
methodId=env->GetMethodID(cls_objClass,"getCustomerID","()I");
//调用customerrequest对象的特定方法getCustomerID
int_customerID=env->CallIntMethod(o_request,methodId,NULL);
//获得customerrequest对象中特定方法getTelNum的id
methodId=env->GetMethodID(cls_objClass,"getTelNum","()Ljava/lang/String;");
//调用customerrequest对象的特定方法getTelNum
str_telNum=(jstring)env->CallObjectMethod(o_request,methodId,NULL);
...
//将用户id拷贝到临时数组
memcpy(_tmp_bind[0]+i*sizeof(int),&int_customerID,sizeof(int));
//将电话号码拷贝到临时数组,如果电话号码字符串超长,报错返回
if(sizeof(char)*strlen(chr_tel)<=sizeof(char)*( 20 + 1)){
memcpy(_tmp_bind[1]+i*sizeof(char)*( 20+1 ),chr_tel,strlen(chr_tel)+1);
}else{
printf("%s too long!\n",chr_tel);
return;
}
...
}
...
}
5.c向java返回一个数组
先创建数组,然后加载java对象,给每个java对象的属性赋值,添加到数组中,最后返回数组。如下例:
JNIEXPORT jobjectArray JNICALL Java_com_oracle_estt_sc_db_impl_SCQueryODBC__1getCustomerRequest
(JNIEnv *env, jobject, jint customerid){
......
//声明存放查询结果的objectarray
jobjectArray jo_array =
env->NewObjectArray(MAX_LINE,env->FindClass("com/oracle/estt/sc/busi/CustomerRequest"),
0); jobject obj;
//发现java Customerrequest类,如果失败,程序返回
jclass clazz = env->FindClass("com/oracle/estt/sc/busi/CustomerRequest");
if(clazz == 0)
return 0;
while ((rc = SQLFetch(hstmt)) == SQL_SUCCESS ||rc == SQL_SUCCESS_WITH_INFO) {
obj = env->AllocObject(clazz);
jfieldID fid_customerID = env->GetFieldID(clazz,"customerID","I");
if (fid_customerID == 0)
return 0;
jfieldID fid_priority = env->GetFieldID(clazz,"priority","I");
if (fid_priority == 0)
return 0;
...
env->SetIntField(obj, fid_customerID, col_customerID);
env->SetIntField(obj, fid_priority, col_priority);
...
//将对象obj添加到object array中
if(j<MAX_LINE){
env->SetObjectArrayElement(jo_array, j, obj);
}else{
break;
}
}
return jo_array;
}
6.jstring向char* 的转换
jstring不能直接在c程序中使用,需要转换成char*。重要的一点是,在使用完char*之后,一定要记得将其释放,以免发生内存泄漏。如下例:
JNIEXPORT jobjectArray JNICALL Java_com_oracle_estt_sc_db_impl_SCQueryODBC__1getCustomerRequestByCondition
(JNIEnv *env, jobject, jstring condition, jint customerid){
//将jstring转换为cha*
char* str_condition=(char*) env->GetStringUTFChars(condition,JNI_FALSE);
......
//释放变量
env->ReleaseStringUTFChars(condition,str_condition);
......
}
7.char*转换成jstring
这个转换就比较麻烦了,但是在数据库操作时会用到。比如,从数据库查询得到的是char*,但是给对象属性赋值的时候需要用jstring,这是需要用到这种转换。具体如下例:
char* col_timestamp=.....;
//加载string类
jclass strClass = env->FindClass("Ljava/lang/String;");
//获得方法id
jmethodID ctorID = env->GetMethodID(strClass, "<init>", "([BLjava/lang/String;)V");
//将字符串转换为jstring
bytes_time = env->NewByteArray(strlen(col_timestamp));
env->SetByteArrayRegion(bytes_time, 0, strlen(col_timestamp), (jbyte*)col_timestamp);
jstring js_time = env->NewStringUTF("utf-8");
js_time=(jstring)env->NewObject(strClass, ctorID, bytes_time, js_time)
8.java类的原型获取方法
在c中创建java对象和调用java对象方法时需要用到java类的原型,特别是其方法签名。具体办法是:到java类所在的目录下,键入名命令:
>javap -s -p 包路径.java类名
以上几点是我这两天写jni程序的一点总结,写出来与大家分享,欢迎批评指导。
推荐资料:
Java Native Interface Specification.http://java.sun.com/j2se/1.5.0/docs/guide/jni/spec/jniTOC.html
发表评论
-
微信JS
2013-10-26 21:17 2096<div class="iteye-blog- ... -
ubuntu下MySQL用source命令导入sql文件出现乱码解决方法
2012-11-18 23:46 1566首先建立数据库的时候指明数据库编码如: CREA ... -
RandomAccessFile
2012-10-18 18:16 986public void run() { try { ... -
java中多种方式读文件
2012-10-18 16:53 985java中多种方式读文件一、多种方式读文件内容。1、按字节读取 ... -
FileChannelMain
2012-10-15 18:12 1116package scan; import java ... -
Apache FtpServer在64位系统下服务不能启动解决方法
2012-06-10 21:29 6917Apache FTPServer是一款用Java开发的 ... -
Java 集合类
2012-06-07 22:03 1794Java 集合类 1. 为什么要了解J ... -
short、int、long与byte之间的转换工具类
2012-05-31 11:05 4525/** * 各基础类型与byte之间的转换 * ... -
Linux Mint 13 配置JAVA 环境
2012-05-24 22:35 26620.1--下载 JAVA ... -
FatJar+Exe4j+Inno Setup 生成可执行的exe文件
2012-04-17 10:54 14631、fatjar 是Eclipse的一个免费的插件。它的 ... -
JPanel JTextField add Focus 获取焦点解决方案
2012-03-30 21:29 3024public class TabPagePanel ex ... -
JList List<E> Page 分页
2012-03-30 21:28 1766package view.retrieve.comps. ... -
JButton setAction的BUG
2012-03-23 10:53 1312今天在使用JButton的时候,想用setText()setI ... -
自定义JTabbedPane皮肤
2012-03-22 12:05 4741package ui; import java.awt. ... -
两个工具类
2012-03-17 21:27 894package com.retrieve.utils; ... -
两个工具类
2012-03-17 21:27 0package com.retrieve.utils; ... -
mysql、sqlserver、oracle分页,java分页统一接口实现
2012-03-13 17:56 0定义: pageStart 起始页,pageEnd 终止页, ... -
Invalid command: InetLoad::load
2012-03-06 16:41 1370Invalid command: InetLoad::load ... -
NIO: High Performance File Copying
2012-03-01 17:25 1207In a previous tip, I discussed ... -
自定义JList
2012-02-03 15:39 802自定义JList。
相关推荐
Java调用C/C++的过程,通常被称为JNI(Java Native Interface),是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互...希望这个教程能为初学者提供一个良好的起点,进一步探索Java与C/C++之间的交互。
JNI(Java Native Interface)是Java平台的标准组成部分,它允许Java代码和其他语言写的代码进行交互。...通过深入学习这些材料,开发者可以熟练地在Java和C/C++之间进行互操作,实现更复杂的功能。
Java Native Interface (JNI) 是Java语言的一个重要特性,它允许Java代码和其他语言写的代码进行交互,特别是C和C++。JNI在Java平台中扮演着桥梁的角色,弥补了Java跨平台特性带来的性能限制,使得Java能够调用本地...
6. **算法与数据结构**: 在蓝桥杯大赛中,无论是Java还是C/C++,算法和数据结构都是核心考察点。链表、树、图、栈、队列等基础数据结构,以及排序、查找、最短路径等算法,都需要参赛者熟练掌握并能灵活运用。 综上...
在Android开发中,有时我们需要利用C或C++的高性能特性,比如处理图形计算、音频处理等,这时就需要在Java和C/C++之间进行交叉调用。Android Studio支持这种跨语言调用,主要通过Android Native Development Kit ...
Java Native Interface(JNI)是Java平台的标准组成部分,它允许Java代码和其他语言写的代码进行交互...在实际应用中,你可以根据需求扩展这些基础概念,例如处理复杂的数据类型、多线程同步以及与Java对象的深度交互。
JNI作为Java与本地代码之间的重要桥梁,对于那些希望利用Java的高级特性和C/C++的强大性能优势的开发者来说至关重要。通过本指南的学习,读者应该能够理解如何在Java中声明和调用本地方法,以及如何在C/C++中实现...
在C/C++中调用Java代码,主要依赖于Java Native Interface (JNI),这是一个允许Java代码与本地代码交互的标准接口。JNI使得开发者可以将C/C++的高性能代码集成到Java应用程序中,或者从C/C++程序中调用Java的类和...
综上所述,C/C++与MySQL/Oracle数据库之间的交互涉及多个方面,包括选择合适的连接方式、实现具体的数据库操作以及遵循最佳实践来确保代码的质量和安全性。掌握这些技能对于开发能够高效利用数据库资源的C/C++应用...
总结,C/C++服务器与Java客户端之间的Socket通信涉及了两端的Socket创建、连接、数据交换以及错误处理等环节。理解并熟练掌握这些步骤,可以帮助开发者构建出可靠的跨平台网络应用。在实际开发中,还应注意安全性、...
**JNI(Java Native Interface)** 是Java平台的一部分,它允许Java代码与其他语言写的代码进行交互,尤其是C和C++。JNI是Java与本地代码之间沟通的桥梁,使得Java应用程序能够调用本地库中的方法,同时也支持从本地...
本手册专注于介绍如何使用JNI来实现Java与C/C++之间的互调。 一、JNI基础知识 1. JNI接口定义:JNI提供了丰富的函数接口,如NewGlobalRef、FindClass、GetMethodID等,用于在Java和本地代码之间建立桥梁。 2. 本地...
Java、C/C++、JavaScript、PHP、Python这五种编程语言在当前的软件开发领域中有着广泛的应用,下面将详细地介绍它们各自的应用场景。 首先,Java语言是一种广泛应用于企业级开发的编程语言。它具有跨平台性、面向...
本篇文章将深入探讨如何使用JNI(Java Native Interface)来实现在C/C++结构体与Java类之间进行数据转换。通过学习本文,你将能够熟练掌握两种常用方法,从而解决这类问题。 首先,我们需要理解JNI的概念。JNI是...
在Android平台上,调用C或C++代码是通过Java Native Interface (JNI) 实现的,这是一种允许Java代码与本地库交互的技术。JNI已经成为Android开发者在性能关键领域,如图形处理、游戏引擎、加密算法等中引入C/C++代码...
这个"android C/C++ JNI普通数据类型 测试工程"是用于演示如何在C/C++与Java之间传递和操作基本数据类型的一个实例。在本文中,我们将深入探讨JNI中的数据类型转换以及如何在C/C++代码和Java代码之间使用它们。 ...
总结,"Android Binder C/C++层实现示例"提供了一个实践性的学习资源,帮助开发者深入理解Binder机制的底层实现,包括Client和Server的交互、Parcel数据封装、Service Manager的使用等核心概念,从而提升对Android...
Java 使用 JNA(Java Native Access)调用C/C++编写的第三方动态库(DLL文件)是一种常见的技术,它允许Java程序直接与本地操作系统接口交互,而无需编写JNI(Java Native Interface)代码。JNA 提供了一种相对简洁...
【C/C++】 C/C++ 是两种常用的编程语言,它们在计算机科学中占有重要的地位。C 语言是一种底层、高效且灵活的语言,适用于系统编程、嵌入式开发以及编写操作系统等。C++ 是 C 语言的扩展,增加了面向对象编程(OOP...