如题,我在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")后才异常的所以才断定是返回的时候异常。求教有谁遇到过返回结构体的时候异常的同志哥给下原因和解决方法,我试过如果返回结构体是没有问题的。

解决方案 »

  1.   

    你这到底是java啊还是C++啊
    结构体,好头疼的东西啊
      

  2.   

    JNIEXPORT jobject JNICALL Java_Moniter_dictionary_TestStruct_getMystruct(JNIEnv *env, jclass obj)
    jclass objectClass = (env)->FindClass("Moniter/dictionary/mystruct");  jclass obj应该不是一个实例吧是一个Class类, 你应该使用env new一个对象吧。
      

  3.   

    找到原因的,如2楼所说。这个里声明的函数是静态函数,所以函数参数第二个参数是jclass,不是jobject.(函数为非静态函数时,第二个参数就为jobject,这个时候如上的做法是没有问题的)。如果是静态方法就需要new对象,附上一个正确的操作方法,发面后面遇到同一问题的同志哥再到处去找。JNIEXPORT jobject JNICALL Java_Moniter_dictionary_TestStruct_getMystruct(JNIEnv *env, jclass obj)
    {
    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;  
    }