1。我在调用native方法时,传递String对象作为参数,但是中文乱码,如何解决这个问题?2。如何在native方法里传递java 对象,

解决方案 »

  1.   

    问题1,没研究过,可能是字符编码转换的问题。
    问题2,我的做法是,在本地语言中,写一个跟传过去的Java对象具有相同成员变量的对象或结构。,实际上在本地方法中进行计算的是本地的那个对象或结构的成员变量。
      

  2.   

    关于第2个问题:
    public class Fun
    {
       static { System.loadLibrary("sis"); }
       public static native ArrayList foo(int i, Vector v);
    }如果要实现这个foo函数;我想问的是:
    1)如何使用这个传入的Vector对象?
    2)如何在实现里new一个ArrayList对象,返回,这个new的对象怎么释放?
      

  3.   

    上面那个例子中编译出来的函数原型如下:/*
     * Class:     com_kkk_aiipclient_JniClient
     * Method:    foo
     * Signature: (ILjava/util/Vector;)Ljava/util/ArrayList;
     */
    JNIEXPORT jobject JNICALL Java_com_kkk_aiipclient_JniClient_foo
      (JNIEnv * env, jclass clazz, jint i, jobject v)
    {
         // 如何使用v ?
         // 如何new ArrayList,然后return?
    }
      

  4.   

    Vector 和 ArrayList 传进去没有试过
    我试过得是
    自己的一个类class A{} 那么在C/C++中用一个struct A{}/Class 代替。
    要是Vector 或ArrayList中都是同一种对象,可以变成对象数组传过去
      

  5.   

    第2个问题可以搞定了,
    但是中文的问题不知道怎么办。比如我在java中调用native方法的时候传的中文,然后在实现里用
    const char* msg = env->GetStringUTFChars(inStr,0);
    这个msg显示出来就是乱码。。
      

  6.   

    GetStringUTFChars() 得到的是按 UTF-8 编码的字符串;
    GetStringChars() 得到的是按 Unicode 编码的字符串。总之,都不是 GBK 编码的字符串,如果你直接打印的话,就会是乱码(因为我想你的运行环境缺省的一定是 GBK 字符集)。需要用 C 函数转换一下,比如 wctomb()
      

  7.   

    搞定,给大家一个类:可以用来在jstring(unicode)和string(char*)之间转换。
    #include <jni.h>
    #include <string>
    using namespace std;class JNIString {
    private:    JNIString (); // Default ctor - disallowedpublic:    // Create a new instance from the specified jstring
        JNIString(JNIEnv* env, const jstring& str) :
            mEnv (env) {
            const jchar* jchar_buffer = env->GetStringChars (str, 0);        
            const wchar_t* wchar_buffer = (const wchar_t*)jchar_buffer;
            int length = wcslen(wchar_buffer);
            
            // Deep Copy, in usual case we only need 
            // Shallow Copy as we just need this class to 
            // provide some convenience for handling jstring
            mJstr = env->NewString (jchar_buffer, length);         mChars = new char[wcslen (wchar_buffer) * 2 + 1];
            WideCharToMultiByte (CP_ACP, 0, wchar_buffer, length + 1,
                     mChars, length * 2 + 1, NULL, NULL);
            env->ReleaseStringChars (str, jchar_buffer);        mString = mChars;
        }    // Create a new instance from the specified string
        JNIString(JNIEnv* env, const string& str) :
            mEnv (env) {
            int slen = str.length ();
            jchar* buffer = new jchar[slen];
            int len = MultiByteToWideChar (CP_ACP, 0, str.c_str (), 
                    str.length (), (wchar_t*)buffer, slen);        if (len > 0 && len < slen)
                buffer[len] = 0;        mJstr = env->NewString (buffer, len);
            delete [] buffer;        mChars = new char[str.length () + 1];
            strcpy (mChars, str.c_str ());        mString.empty ();
            mString = str.c_str ();
        }    // Create a new instance as a copy of the specified JNIString
        JNIString(const JNIString& rhs) :
            mEnv (rhs.mEnv) {
            const jchar* jstr = mEnv->GetStringChars (rhs.mJstr, 0);
            int length = wcslen((wchar_t*)jstr);
            mJstr = mEnv->NewString (jstr, length);
            mEnv->ReleaseStringChars (rhs.mJstr, jstr);        mChars = new char[strlen (rhs.mChars) + 1];
            strcpy (mChars, rhs.mChars);        mString = rhs.mString.c_str ();
        }    // Delete the instance and release allocated storage
        ~JNIString() { delete [] mChars; }    // assign a new value to this instance from the given string
        JNIString & operator =(const string& rhs) {
            delete [] mChars;        int slen = rhs.length ();
            jchar* buffer = new jchar[slen];
            int len = MultiByteToWideChar (CP_ACP, 0, rhs.c_str (), 
                    rhs.length (), (wchar_t*)buffer, slen);        if (len > 0 && len < slen)
                buffer[len] = 0;        mJstr = mEnv->NewString (buffer, len);
            delete [] buffer;        mChars = new char[rhs.length () + 1];
            strcpy (mChars, rhs.c_str ());        mString = rhs.c_str ();        return *this;
        }    // Supply operator methods for converting the JNIString to a string
        // or char*, making it easy to pass JNIString arguments to functions
        // that require string or char* parameters.
        string & GetString() { return mString; }
        operator string() { return mString; }
        operator const char* () { return mString.c_str (); }
        operator jstring() { return mJstr; }private:    JNIEnv* mEnv;   // The enviroment pointer for this native method.
        jstring mJstr;  // A copy of the jstring object that this JNIString represents
        char* mChars;   // Pointer to a ANSI code page char array
        string mString; // string buffer for holding the "value" of this instance (ANSI code page)
    };
      

  8.   

    问一个另外不相干的问题,JAVA中有没有可用的Tree类?或者谁有写好的?我自己懒得写了。
    最好带深度优先访问方法。
      

  9.   

    我们用java来解决实际问题。java技术交流,讨论java的技术细节和最新技术。欢迎中高级程序员加入讨论。QQ群:3001581