用JNI从C传递结构体到JAVA
来源:互联网 发布:用友易代账软件 编辑:程序博客网 时间:2024/05/22 04:33
直接上C的实现
typedef struct Foo {
int len;
char name[100];
} Foo_t;
JNIEXPORT jint JNICALL
Java_TestJNI_foo(JNIEnv *env, jobject obj, jobject fooObj) {
Foo_t * bar = malloc(sizeof(Foo_t));
jclass clazz;
jfieldID fid;
//init the bar data of C
strcpy(bar->name, "Yachun Miao");
bar->len = strlen(bar->name);
// mapping bar of C to foo
clazz = (*env)->GetObjectClass(env, fooObj);
if (0 == clazz) {
printf("GetObjectClass returned 0\n");
return (-1);
}
fid = (*env)->GetFieldID(env, clazz, "len", "I");
(*env)->SetLongField(env, fooObj, fid, bar->len);
fid = (*env)->GetFieldID(env, clazz, "name", "Ljava/lang/String;");
jstring name = (*env)->NewStringUTF(env, bar->name);
(*env)->SetObjectField(env, fooObj, fid, name);
free(bar);
return 0;
}
int len;
char name[100];
} Foo_t;
JNIEXPORT jint JNICALL
Java_TestJNI_foo(JNIEnv *env, jobject obj, jobject fooObj) {
Foo_t * bar = malloc(sizeof(Foo_t));
jclass clazz;
jfieldID fid;
//init the bar data of C
strcpy(bar->name, "Yachun Miao");
bar->len = strlen(bar->name);
// mapping bar of C to foo
clazz = (*env)->GetObjectClass(env, fooObj);
if (0 == clazz) {
printf("GetObjectClass returned 0\n");
return (-1);
}
fid = (*env)->GetFieldID(env, clazz, "len", "I");
(*env)->SetLongField(env, fooObj, fid, bar->len);
fid = (*env)->GetFieldID(env, clazz, "name", "Ljava/lang/String;");
jstring name = (*env)->NewStringUTF(env, bar->name);
(*env)->SetObjectField(env, fooObj, fid, name);
free(bar);
return 0;
}
对应的Java调用
public class Foo {
protected int len;
protected String name;
}
private static native int foo(Foo fooObj);
public static void main(String args[]) {
System.loadLibrary("mylib");
Foo foo = new Foo();
foo(foo);
System.out.println(foo.name);
System.out.println(foo.len);
}
protected int len;
protected String name;
}
private static native int foo(Foo fooObj);
public static void main(String args[]) {
System.loadLibrary("mylib");
Foo foo = new Foo();
foo(foo);
System.out.println(foo.name);
System.out.println(foo.len);
}
参考链接
http://www.steveolyo.com/JNI/JNI.html#CSTRCJ
http://docs.oracle.com/javase/6/docs/technotes/guides/jni/spec/types.html
- 用JNI从C传递结构体到JAVA
- 用JNI从C传递结构体到JAVA
- 用JNI从C传递结构体到JAVA
- jni传递结构体
- 从C开始_结构体_把结构信息传递到函数中1
- 从C开始_结构体_把结构信息传递到函数中2
- Android jni c/c++传递实体类到java
- Android JNI(二):从Java到C++/C
- JNI 传递结构体参数
- JNI 传递结构体参数
- JNI 传递结构体参数
- JNI 传递结构体参数
- JNI层与Java层结构体传递
- JNI返回自定义结构体数组到Java
- JNI 传递字符串和结构体
- JNI中C和java传递数组
- JNI学习笔记 C++传递结构体、String、数组对象给JavaC++传递结构体、String、数组对象给Java
- 使用JNI将C结构体转为JAVA实体类
- IplImage结构
- Windows Server 2008 R2 服务器安装(重装)流程备忘
- Example of hash in Perl
- 安卓学习--------spinner控件
- 0917
- 用JNI从C传递结构体到JAVA
- android 实现定时拍照功能
- WebSphere启动was出错:server1 注册成作为 Windows 服务运行
- 14条建议,使你的IT职业生涯更上一层楼
- 选择TTL和CMOS混合电路时需要注意的一些问题
- 在CentOS5.4下安装SVN
- java基础01 面向对象
- 常用sql
- OCP-1Z0-052-V8.02-80题