如题,我在servlet中调用jni发生异常,jni返回一个结构体。总是在返回结构体的时候就异常了。
代码如下:
结构体代码:
package Moniter.dictionary;public class mystruct {
public int i1;
public int i2;
}
jni 的代码:
package Moniter.dictionary;public class TestStruct {
static {
System.loadLibrary("TestJni");
}
public static native mystruct getMystruct();
}
Jni 调用DLL的部分:生成的头文件:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class Moniter_dictionary_TestStruct */#ifndef _Included_Moniter_dictionary_TestStruct
#define _Included_Moniter_dictionary_TestStruct
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: Moniter_dictionary_TestStruct
* Method: getMystruct
* Signature: ()LMoniter/dictionary/mystruct;
*/
JNIEXPORT jobject JNICALL Java_Moniter_dictionary_TestStruct_getMystruct
(JNIEnv *, jclass);#ifdef __cplusplus
}
#endif
#endif
jni CPP:
#include "stdafx.h"
#include "Moniter_dictionary_TestStruct.h"
JNIEXPORT jobject JNICALL Java_Moniter_dictionary_TestStruct_getMystruct(JNIEnv *env, jclass obj)
{
/**//* 下面为获取到Java中对应的实例类中的变量*/
OutputDebugString(("******0 setp"));
jclass objectClass = (env)->FindClass("Moniter/dictionary/mystruct"); if (objectClass == NULL)
{
OutputDebugString(("******the object is null"));
}
//获取类中每一个变量的定义
//名字
//序列号
OutputDebugString(("******2 setp"));
jfieldID ival1 = (env)->GetFieldID(objectClass,"i1","I");
jfieldID ival2 = (env)->GetFieldID(objectClass,"i2","I"); OutputDebugString(("******3 setp"));
//给每一个实例的变量付值
(env)->SetShortField(obj,ival1,10);
(env)->SetShortField(obj,ival2,10);
OutputDebugString(("******5 setp"));
return obj;
}在servlet中调用
mystruct ttMystruct = TestStruct.getMystruct();
从调用testjni.dll的 outputdebug日志来看都是执行到("******5 setp")后才异常的所以才断定是返回的时候异常。求教有谁遇到过返回结构体的时候异常的同志哥给下原因和解决方法,我试过如果返回结构体是没有问题的。
代码如下:
结构体代码:
package Moniter.dictionary;public class mystruct {
public int i1;
public int i2;
}
jni 的代码:
package Moniter.dictionary;public class TestStruct {
static {
System.loadLibrary("TestJni");
}
public static native mystruct getMystruct();
}
Jni 调用DLL的部分:生成的头文件:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class Moniter_dictionary_TestStruct */#ifndef _Included_Moniter_dictionary_TestStruct
#define _Included_Moniter_dictionary_TestStruct
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: Moniter_dictionary_TestStruct
* Method: getMystruct
* Signature: ()LMoniter/dictionary/mystruct;
*/
JNIEXPORT jobject JNICALL Java_Moniter_dictionary_TestStruct_getMystruct
(JNIEnv *, jclass);#ifdef __cplusplus
}
#endif
#endif
jni CPP:
#include "stdafx.h"
#include "Moniter_dictionary_TestStruct.h"
JNIEXPORT jobject JNICALL Java_Moniter_dictionary_TestStruct_getMystruct(JNIEnv *env, jclass obj)
{
/**//* 下面为获取到Java中对应的实例类中的变量*/
OutputDebugString(("******0 setp"));
jclass objectClass = (env)->FindClass("Moniter/dictionary/mystruct"); if (objectClass == NULL)
{
OutputDebugString(("******the object is null"));
}
//获取类中每一个变量的定义
//名字
//序列号
OutputDebugString(("******2 setp"));
jfieldID ival1 = (env)->GetFieldID(objectClass,"i1","I");
jfieldID ival2 = (env)->GetFieldID(objectClass,"i2","I"); OutputDebugString(("******3 setp"));
//给每一个实例的变量付值
(env)->SetShortField(obj,ival1,10);
(env)->SetShortField(obj,ival2,10);
OutputDebugString(("******5 setp"));
return obj;
}在servlet中调用
mystruct ttMystruct = TestStruct.getMystruct();
从调用testjni.dll的 outputdebug日志来看都是执行到("******5 setp")后才异常的所以才断定是返回的时候异常。求教有谁遇到过返回结构体的时候异常的同志哥给下原因和解决方法,我试过如果返回结构体是没有问题的。
解决方案 »
- 你们有人维护ip库吗
- struts1.2 从jsp页面传递数据到action的问题!!求解~~
- jsp返回结果页面问题?
- HTTPURLConnection下载文件的问题
- Linux下Tomcat配置MySQL数据源和在Windows下的配置有什么差别吗?
- 各位大侠struts开发web程序,客户端想读串口数据可以吗,顶者有分。
- 网上 fuzhe(令狐虫) 给了一个下载文件的servlet 程序,但在我这有点问题????
- 如何配置TOMCAT和MySQL的JDBC?在线等待...
- jsp初学者,希望指点!!:)
- struts2 设置了上传文件的类型 任然提示失败
- 求助!
- Java Web编码问题
结构体,好头疼的东西啊
jclass objectClass = (env)->FindClass("Moniter/dictionary/mystruct"); jclass obj应该不是一个实例吧是一个Class类, 你应该使用env new一个对象吧。
{
jclass objectClass = (env)->FindClass("Moniter/dictionary/mystruct");
//获取类中每一个变量的定义
//名字
//序列号
//获取构造函数,后面创建对象用
jmethodID mid = (env)->GetMethodID(objectClass,"<init>","()V");
jfieldID ival1 = (env)->GetFieldID(objectClass,"i1","I");
jfieldID ival2 = (env)->GetFieldID(objectClass,"i2","I");
//给每一个实例的变量付值
jobject _obj = (env)->NewObject(obj,mid);
(env)->SetShortField(_obj,ival1,10);
(env)->SetShortField(_obj,ival2,5);
return _obj;
}