当前位置:首页 > 智能硬件 > 人工智能AI
[导读] java与c/c++之间的数据交互—–jni点滴 最近作一个TIemsten数据库的项目,用到了jni技术。在这个项目中,我们用java来写界面和业务逻辑,用c语

java与c/c++之间的数据交互—–jni点滴

最近作一个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

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
换一批
延伸阅读

软硬协同,共建视频垂类大模型与AIGC创作平台

关键字: 人工智能 视觉芯片 CPU

AI数据中心疯狂抢内存,智能手机行业被推进寒冬。IDC最新初步数据显示,2026年第三季度全球智能手机出货量只有2.553亿部,同比暴跌22%,创下有记录以来最大季度跌幅。

关键字: 内存 智能手机 AI数据中心

10月15日,传音控股正式在香港交易所主板挂牌上市。

关键字: 智能手机

随着汽车座舱从显示与娱乐中心逐渐演变为 AI 驱动的人机交互平台,音频与语音处理的重要性也在快速提升。作为中国领先的智能座舱芯片厂商之一,芯驰科技在其新一代 AI 座舱 SoC X10 中采用了 Cadence Tens...

关键字: 消费电子 智能座舱 DSP

CPU市场正迎来新一轮涨价潮。英特尔、高通、AMD三大厂商接力调价,涨价压力从晶圆制造端一路传导至PC、服务器及终端整机。

关键字: CPU 内存 台积电

在富士通、Meta 和 OpenAI 的支持下,Arm 推出全新的 CPU 评估方法,第三方独立验证显示 Arm AGI CPU 单机架性能可达主流 x86 服务器处理器的两倍

关键字: CPU AI 智能体 服务器

10月12日,全球最大陆路单体口岸——深圳新皇岗口岸正式开通运行。作为粤港澳大湾区互联互通的核心陆路口岸,新皇岗口岸设计日通关客流可达20万人次,旅客通关时间压缩至约5分钟,大幅提升深港跨境人员往来效率。在这座超级智慧口...

关键字: CPU 算力 处理器

该传感器的触控方式与手机屏幕类似,能够检测到手指的接触。更棒的是,它还能穿透塑料、玻璃和木材等材料工作。电容式触摸技术通过感知表面电容的变化来实现触控——例如当你的手指(能导电)接触屏幕或按钮时,会改变其电场。这项技术正...

关键字: 传感器 智能手机 电容 TTP223

据韩国当地报道,三星移动体验事业部计划今年第四季度大幅削减智能手机产量,预计减产20%至30%,近期已通知供应商。

关键字: 智能手机

Oct. 8, 2026 ---- 根据TrendForce集邦咨询最新笔记本产业研究,2027年笔记本市场的主要风险将由供应限制转向成本上升对需求的影响。TrendForce集邦咨询目前预期2027年全球笔记本出货量将...

关键字: DRAM CPU SSD
关闭