给我发邮件吧,我给你一篇我在《开放系统世界》中发表的关于C/C++中调用JAVA的文章![email protected]

解决方案 »

  1.   

    liusoft:
    已经给你发邮件了,看到赶快给我发一个吧,谢谢
    这个问题很急,希望知道的告诉我一声怎么解决
    thanks~
      

  2.   

    请通过下面的URL地址访问我的文章!http://developer.ccidnet.com/pub/disp/Article?columnID=1078&articleID=38068&pageNO=1
      

  3.   

    怎么能够让通过Java开发的GUI程序不弹出Java的控制台窗口呢? <== ...... 用javaw就可以了…………不用JNI这么麻烦,Eclipse也没有用JNI做这种事情的……
      

  4.   

    另外你的问题是:jfieldID fid = env->GetFieldID(cls,"aB","LA;");应该这样写的GetFieldID最后一个参数是字段的类型签名,前一个才是字段的名称。
      

  5.   

    to leonzhao:
    我也知道是这个问题
    可是用这种方法还是得不到这个fid
    你能不能给我一个例子?
    谢谢~
      

  6.   

    A.java:class A
    {
        int nA;
        String sA;
        public static void main(String[] args) {
         B ab = new B();
         ab.aB = new A();
         ab.testObject(ab);
        }
    }
    class B
    {
        A aB;
    public native void testObject(B b);

    static {
    System.loadLibrary("test");
    }
    }// Test.cpp : Defines the entry point for the DLL application.
    //#include "stdafx.h"
    #include "B.h"JNIEXPORT void JNICALL Java_B_testObject(JNIEnv *env, jobject obj, jobject binst) {
    jclass cls = env->GetObjectClass(binst); //obj是传入的参数,得到的是B类的实例
    jfieldID fid = env->GetFieldID(cls,"aB","LA;"); //得到aB属性的fid
    jobject aObject = env->GetObjectField(cls,fid);//得到A类对象
    if (aObject != NULL) {
    jclass aCls = env->GetObjectClass(aObject);//得到A类对象的实例
    }
    }
      

  7.   

    恩,对象我可以得到了
    可是怎么在c语言的方法中得到String类型的sA然后赋值给c语言的char[]数组呢?
    谢谢~
      

  8.   

    给你两个方法,这两个方法是支持中文字符串传送的:#define CURRENT_ENCODE "GBK"
    jstring WindowsTojstring(JNIEnv* env, char* str)
    {
            jstring rtn = 0;
            jsize len = strlen(str);        jclass clsstring = env->FindClass("java/lang/String");        //new encode string default "GBK"
            jstring strencode = env->NewStringUTF(CURRENT_ENCODE);
            jmethodID mid = env->GetMethodID(clsstring, "<init>", "([BLjava/lang/String;)V");
            jbyteArray barr = env->NewByteArray(len);        env->SetByteArrayRegion(barr,0,len,(jbyte*)str);        //call new String(byte[] b,String encode)
            rtn = (jstring)env->NewObject(clsstring,mid,barr,strencode);        return rtn;
    }char* jstringToWindows(JNIEnv* env, jstring jstr)
    {
            char* rtn = NULL;
            jclass clsstring = env->FindClass("java/lang/String");        //new encode string default "GBK"
            jstring strencode = env->NewStringUTF(CURRENT_ENCODE);
            jmethodID mid = env->GetMethodID(clsstring, "getBytes", "(Ljava/lang/String;)[B");        //call String.getBytes method to avoid incompatible migrating into solaris
            jbyteArray barr= (jbyteArray)env->CallObjectMethod(jstr,mid,strencode);        jsize alen = env->GetArrayLength(barr);
            jbyte* ba = env->GetByteArrayElements(barr,JNI_FALSE);        if(alen > 0)
            {
                    rtn = (char*)malloc(alen+1);    //new char[alen+1];
                    memcpy(rtn,ba,alen);
                    rtn[alen]=0;
            }
            env->ReleaseByteArrayElements(barr,ba,0);        return rtn;
    }
      

  9.   

    谢谢,可是我的环境是在solaris系统的
    这个方法不能用
    也看不出是哪里的缘故
    请指教~
      

  10.   

    不行阿
    我一使用这个方法就出现jvm异常
    也不清楚是什么缘故了
    :(
    在windows下运行就没有问题
      

  11.   

    Unexpected Signal : 11 occurred at PC=0xFE1D7B24
    Function=[Unknown. Nearest: JVM_IsSameClassPackage+0x7338]
    Library=/usr/j2se/jre/lib/sparc/client/libjvm.soCurrent Java thread:
            at B.testObject(Native Method)
            at B.main(B.java:10)Dynamic libraries:
    0x10000         java
    0xff350000      /usr/lib/libthread.so.1
    0xff390000      /usr/lib/libdl.so.1
    0xff200000      /usr/lib/libc.so.1
    0xff340000      /usr/platform/SUNW,Netra-T4/lib/libc_psr.so.1
    0xfe000000      /usr/j2se/jre/lib/sparc/client/libjvm.so
    0xff2e0000      /usr/lib/libCrun.so.1
    0xff1e0000      /usr/lib/libsocket.so.1
    0xff100000      /usr/lib/libnsl.so.1
    0xff0d0000      /usr/lib/libm.so.1
    0xff310000      /usr/lib/libw.so.1
    0xff0b0000      /usr/lib/libmp.so.2
    0xff080000      /usr/j2se/jre/lib/sparc/native_threads/libhpi.so
    0xff050000      /usr/j2se/jre/lib/sparc/libverify.so
    0xfe7c0000      /usr/j2se/jre/lib/sparc/libjava.so
    0xff030000      /usr/j2se/jre/lib/sparc/libzip.so
    0xfdee0000      /usr/lib/locale/en_US.ISO8859-1/en_US.ISO8859-1.so.2
    0xfa3a0000      /users/judic/libtest.soLocal Time = Thu Jul 10 09:49:02 2003
    Elapsed Time = 0
    #
    # HotSpot Virtual Machine Error : 11
    # Error ID : 4F530E43505002E6 01
    # Please report this error at
    # http://java.sun.com/cgi-bin/bugreport.cgi
    #
    # Java VM: Java HotSpot(TM) Client VM (1.4.1_03-b02 mixed mode)
    #
    # An error report file has been saved as hs_err_pid4310.log.
    # Please refer to the file for further information.
    #
    Abort (core dumped)
    这是出错信息
    jsize alen = env->GetArrayLength(barr);
    这是你给的方法出错的地方
    如果我把size用参数传递进去,这句话略去,那么
    jbyte* ba = env->GetByteArrayElements(barr,JNI_FALSE);
    这句语句出错了
    我的程序牵涉到太多的其他包
    所以发不上来
    我传递进去的jstring是“1234”(在java这里是这样的)
      

  12.   

    能不能用这个方法:
    我得到jstring之后用
    jchar* sPin = (jchar*)env->GetStringChars(pin,0);
    然后将jchar(unsigned short*)转换到char*
    可是这怎么转换我不是很清楚,可以用for循环来实现吧?
      

  13.   

    (jchar*)env->GetStringChars(pin,0); <== 不支持中文。想在返回的地方得到byte[]直接写就可以了。Function=[Unknown. Nearest: JVM_IsSameClassPackage+0x7338] <== 这个错误是没有见过的,我只能说是你的环境可能有问题了。我得方法只要你不传null上去,都不会有什么问题的。
      

  14.   

    嗯,这个问题我暂时使用
    (jchar*)env->GetStringChars(pin,0); 来处理了
    因为我的消息里面没有中文的
    全是英文系统现在暂时没有其他问题了
    感谢您的大力帮助,我终于走通了jni调用c语言实现的编码方法,具体实现可能还有其他问题
    请告诉我你的邮件地址吧?有问题再向你请教
    thanks & Regards
      

  15.   

    我在编译这个方法的时候:char* jstringToWindows(JNIEnv* env, jstring jstr)
    出现了如下错误:为什么?
    d:\cproject\javajde\jde_jdeoperationmanager.c(17) : error C2223: left of '->FindClass' must point to struct/union
      

  16.   

    你把你的c文件改成cpp结尾就可以了
    用c++来实现
      

  17.   

    你好
    又麻烦你了
    我想把char*转换成jstring,可是使用你的方法运行出现下面的异常:
    Exception in thread "main" java.lang.NoSuchMethodError: sun.io.ByteToCharGBK.getIndex1()[S
            at sun.nio.cs.ext.GBK$Decoder.<init>(GBK.java:45)
            at sun.nio.cs.ext.GBK.newDecoder(GBK.java:33)
            at java.lang.StringCoding$CharsetSD.<init>(StringCoding.java:164)
            at java.lang.StringCoding$CharsetSD.<init>(StringCoding.java:155)
            at java.lang.StringCoding.decode(StringCoding.java:211)
            at java.lang.String.<init>(String.java:327)
            at java.lang.String.<init>(String.java:356)
            at com.utstar.wcdma.hlr.Coder.decodeAuth(Native Method)
            at com.utstar.wcdma.hlr.Coder.main(Coder.java:120)
    我使用
    char * imsiStr 是一个指针,值是”460123412345678“
    const jchar * imsiString是指向const jchar的指针
    imsiSize是字符串的长度,这里为15
    我使用下面的方法
    for(int i = 0; i < imsiSize; i ++)
        imsiString[i] = imsiStr[i];
    jstring imsi = env->NewString(imsiString, imsiSize);
    这样没有错误,可是我在java那边打印出来是乱码。
    请帮我看看是什么原因?
    Thanks & Regards
      

  18.   

    你的语言包是不是有问题?或者Java的encoding配置?或者JDK版本?我记得Solaris确实配中文很讨厌的。用JNI默认的方法肯定是乱码的。
      

  19.   

    我用的是jdk1.4.1的版本
    而且我里面放的还不是中文阿
    全是英文的
    这不应该会出现乱码的吧