JNI求助

想喝咖啡的貓 2006-03-28 02:23:33
现在公司要求将C/C++的一个struct做为函数参数(或返回值),要求用Java调用它(.dll).
我该如何在Java中写对应类?
...全文
79 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
想喝咖啡的貓 2006-03-29
  • 打赏
  • 举报
回复
先运行javac 生成.class, 再用javah 生成.h文件.
将.h引入到C/C++编译器,生成.dll,将.dll引入Java根目录

------------------
C/C++结构如下:
struct {
long id;
int age;
}Struct;
------------------
package javabeans;

public class MyStruct {
private Struct struct;

static{
//加载.dll文件,无需扩展名
System.loadLibrary("struct_test2");
}

public native void setStruct(Struct struct);
public native Struct getStruct();

public void setStruct_J(Struct struct){
this.struct = struct;
}
public Struct getStruct_J(){
return this.struct;
}
}
----------------
//与C/C++对应的Java类如下:
package javabeans;

public class Struct {
public long id;
public int age;

public native static Struct newStruct(long id, int age);
}
-----------------
/* DO NOT EDIT THIS FILE - it is machine generated */
#include "jni.h"
/* Header for class javabeans_MyStruct */

#ifndef _Included_javabeans_MyStruct
#define _Included_javabeans_MyStruct
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: javabeans_MyStruct
* Method: setStruct
* Signature: (Ljavabeans/Struct;)V
*/
JNIEXPORT void JNICALL Java_javabeans_MyStruct_setStruct
(JNIEnv *, jobject, jobject);

/*
* Class: javabeans_MyStruct
* Method: getStruct
* Signature: ()Ljavabeans/Struct;
*/
JNIEXPORT jobject JNICALL Java_javabeans_MyStruct_getStruct
(JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif
-----------------
/* DO NOT EDIT THIS FILE - it is machine generated */
#include "jni.h"
/* Header for class javabeans_Struct */

#ifndef _Included_javabeans_Struct
#define _Included_javabeans_Struct
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: javabeans_Struct
* Method: newStruct
* Signature: (JI)Ljavabeans/Struct;
*/
JNIEXPORT jobject JNICALL Java_javabeans_Struct_newStruct
(JNIEnv *, jclass, jlong, jint);

#ifdef __cplusplus
}
#endif
#endif
-----------------------
#include "javabeans_MyStruct.h"

struct {
long id;
int age;
}Struct;

JNIEXPORT void JNICALL Java_javabeans_MyStruct_setStruct
(JNIEnv *env, jobject obj_this, jobject jobj_mystruct_struct){
jclass jc_mystruct = env->FindClass("javabeans/MyStruct");
jfieldID jf_mystruct_struct = env->GetFieldID(jc_mystruct, "struct", "Ljavabeans/Struct;");

env->SetObjectField(obj_this, jf_mystruct_struct, jobj_mystruct_struct);
}

JNIEXPORT jobject JNICALL Java_javabeans_MyStruct_getStruct
(JNIEnv *env, jobject obj_this){
jclass jc_mystruct = env->FindClass("javabeans/MyStruct");
jfieldID jf_mystruct_struct = env->GetFieldID(jc_mystruct, "struct", "Ljavabeans/Struct;");

jobject jobj_struct = env->GetObjectField(obj_this, jf_mystruct_struct);

return jobj_struct;
}
-----------------------------
#include "javabeans_Struct.h"

JNIEXPORT jobject JNICALL Java_javabeans_Struct_newStruct
(JNIEnv *env, jclass jc_this, jlong jl_id, jint ji_age){
jmethodID jm_init = env->GetMethodID(jc_this, "<init>", "()V");
jobject jobj_this = env->NewObject(jc_this, jm_init);


jfieldID jf_id = env->GetFieldID(jc_this, "id", "J");
jfieldID jf_age = env->GetFieldID(jc_this, "age", "I");

env->SetLongField(jobj_this, jf_id, jl_id);
env->SetIntField(jobj_this, jf_age, ji_age);

return jobj_this;
}
------------------------
xiachedan 2006-03-28
  • 打赏
  • 举报
回复
网上很多!用google,baidu,。。。。。。。。。。。

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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