java发送c语言结构体_通过JNI将JAVA对象映射为C语言的结构体,然后这个结构体作为参数传给下层C语言的有关问题,这个请大家帮忙看看小弟我写的为什么不行啊...

通过JNI将JAVA对象映射为C语言的结构体,然后这个结构体作为参数传给下层C语言的问题,这个请大家帮忙看看我写的为什么不行啊。

/我的想法是将JAVA对象传过来的值,赋值给结构体STRUCT_User_Info,但是我以下的赋值好像不行

JAVA 类文件对应C语言结构体User_Info

UserInfo.java

public class UserInfo{

private String name="hello";

private int nLeft = 0;

private int nRight  = 0;

}

----------------------

test.h头文件

struct STRUCT_User_Info

{

intnLeft;

intnRight;

char            *name;

};

--------------------

testJNI.c文件(符合JNI标准)

JNIEXPORT jint JNICALL Java_com_UserInfo(JNIEnv *env, jobject obj){

//获取Java中的实例类

jclass objectClass =  (*env)->FindClass(env,"domain/UserInfo");

jfieldID temName = (*env)->GetFieldID(env,objectClass,"name","Ljava/lang/String;");

jfieldID temLeft = (env)->GetFieldID(objectClass,"nLeft","I");

jfieldID temRight = (env)->GetFieldID(objectClass,"nRight","I");

struct STRUCT_User_Info userInfo; //我的想法是将JAVA传过来的值,赋值给结构体STRUCT_User_Info

userInfo.name = temName;//但是这么赋值好像不行

userInfo.nLeft=temLeft;

userInfo.nRight=temRight;

//C函数

callTest(userInfo)//然后以这个结构体作为参数传给c程序

return 0;

}

--------------

test.c文件(普通C程序)

int callTest(struct STRUCT_User_Info *userInfo{

具体逻辑

.........

return 0;

}

------解决方案--------------------

userInfo.name = temName;//但是这么赋值好像不行

java的String对象存储了字符对象"hello",不想c语言的char*,只存储了一个指针,这样当然不行。

LZ要做的是提取String对象的内容,然后在JNI中分配一段同样大小的内存,然后存储该字符串。

------解决方案--------------------

引用:Quote: 引用:userInfo.name = temName;//但是这么赋值好像不行

java的String对象存储了字符对象"hello",不想c语言的char*,只存储了一个指针,这样当然不行。

LZ要做的是提取String对象的内容,然后在JNI中分配一段同样大小的内存,然后存储该字符串。

有点糊涂,能具体说明下吗,现在我就是对细节不清楚。

Prompt.java:

class Prompt {

// native method that prints a prompt and reads a line

private native String getLine(String prompt);

public static void main(String args[]) {

Prompt p = new Prompt();

String input = p.getLine("Type a line: ");

System.out.println("User typed: " + input);

}

static {

System.loadLibrary("Prompt");

}

}

JNI文件代码示例:

XXX.c

JNIEXPORT jstring JNICALL

Java_Prompt_getLine(JNIEnv *env, jobject obj, jstring prompt)

{

/* assume the prompt string and user input has less than 128 characters */

char outbuf[128], inbuf[128];

/* 下面的2句提取从Java那边传递过来的字符串到outbuf */

int len = (*env)->GetStringLength(env, prompt);

(*env)->GetStringUTFRegion(env, prompt, 0, len, outbuf);

printf("%s", outbuf);

scanf("%s", inbuf);

return (*env)->NewStringUTF(env, inbuf);

}

到网上搜索 JNI Programmer’s Guide and Specification 文档,有详细的阐述。

以前做过几个java结合JNI的案子,这份资料帮助很大,呵呵。

------解决方案--------------------

不要做A语言代码修改为B语言代码的无用功。

也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。

即可很方便地让A、B两种语言之间协调工作。

------解决方案--------------------

不直接赋值的。使用 (env)->GetStringLength(jstr );,获取一下长度,或者知道长度直接定义一个char数组,然后使用(char*)env->GetStringUTFChars(jstr,0);  获取

参与评论 您还未登录,请先 登录 后发表或查看评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:游动-白 设计师:我叫白小胖 返回首页

打赏作者

13134722143

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值