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

lgmsyy 2014-03-18 01:09:06
/我的想法是将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
{
int nLeft;
int nRight;
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;
}
...全文
436 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
一梦华胥引 2015-11-12
  • 打赏
  • 举报
回复
请问楼主解决了吗?我最近也遇到了类似的问题,userInfo.name = temName;这么赋值不行,那么userInfo.nLeft=temLeft;那么整型赋值行不行啊?
碼上道 2014-03-19
  • 打赏
  • 举报
回复
不直接赋值的。使用 (env)->GetStringLength(jstr );,获取一下长度,或者知道长度直接定义一个char数组,然后使用(char*)env->GetStringUTFChars(jstr,0); 获取
赵4老师 2014-03-19
  • 打赏
  • 举报
回复
不要做A语言代码修改为B语言代码的无用功。 也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。 只需让A、B语言代码的输入输出重定向到文本文件,或修改A、B语言代码让其通过文本文件输入输出。 即可很方便地让A、B两种语言之间协调工作。
lgmsyy 2014-03-19
  • 打赏
  • 举报
回复
哎。。。。。。
JiMoKuangXiangQu 2014-03-18
  • 打赏
  • 举报
回复
引用 3 楼 lgmsyy 的回复:
[quote=引用 2 楼 JiMoKuangXiangQu 的回复:]
userInfo.name = temName;//但是这么赋值好像不行
java的String对象存储了字符对象"hello",不想c语言的char*,只存储了一个指针,这样当然不行。 LZ要做的是提取String对象的内容,然后在JNI中分配一段同样大小的内存,然后存储该字符串。
有点糊涂,能具体说明下吗,现在我就是对细节不清楚。[/quote] 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的案子,这份资料帮助很大,呵呵。
lgmsyy 2014-03-18
  • 打赏
  • 举报
回复
引用 2 楼 JiMoKuangXiangQu 的回复:
userInfo.name = temName;//但是这么赋值好像不行
java的String对象存储了字符对象"hello",不想c语言的char*,只存储了一个指针,这样当然不行。 LZ要做的是提取String对象的内容,然后在JNI中分配一段同样大小的内存,然后存储该字符串。
有点糊涂,能具体说明下吗,现在我就是对细节不清楚。
JiMoKuangXiangQu 2014-03-18
  • 打赏
  • 举报
回复
userInfo.name = temName;//但是这么赋值好像不行
java的String对象存储了字符对象"hello",不想c语言的char*,只存储了一个指针,这样当然不行。 LZ要做的是提取String对象的内容,然后在JNI中分配一段同样大小的内存,然后存储该字符串。
lgmsyy 2014-03-18
  • 打赏
  • 举报
回复
有人帮忙吗???

69,368

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧