http://www.excelsior-usa.com/home.html

解决方案 »

  1.   

    Pass a string to/from Java to/from C
    To Java from C (as seen from the previous How-to) : #include "JavaHowTo.h" JNIEXPORT jstring JNICALL Java_JavaHowTo_sayHello
      (JNIEnv *env, jobject obj) {
        return  env->NewStringUTF("Hello world");
    }
     
    From Java to C : Suppose we have a Java Class public class MyClass {
      public String sayHello(){
         return  "Hello world From Java";
      }
    }
     
    then from C, we want to call the Java sayHello() method which returns a String : JNIEXPORT void JNICALL Java_JavaHowTo_sayHello
      (JNIEnv *env, jobject obj) {
        const char *str;
      
        jclass myclass_class =(jclass) env->NewGlobalRef 
             (env->FindClass ("MyClass"));
            
        // we need the MyClass constructor    
        jmethodID constructorID = env->GetMethodID
             (myclass_class, "", "()V");
             
        // and the sayHello() method
        jmethodID methodID = env->GetMethodID
             (myclass_class, "sayHello", "()Ljava/lang/String;");    // instanciate a MyClass object
        jobject myclass_object =  env->NewObject
             (myclass_class, constructorID);
        
        // call the sayHello() method
        jstring s = (jstring)  env->CallObjectMethod
             (myclass_object, methodID);
        
        // convert the Java String to use it in C
        str = env->GetStringUTFChars(s, 0);
        printf("%s" , str);
        env->ReleaseStringUTFChars(s, str);  
        } 
    The Java JNI wrapper would be class JavaHowTo {
      public native void sayHello();
      static {
        System.loadLibrary("javahowto"); 
      }
    }
     
    And finally, to use it public class JNIJavaHowTo {
      public static void main(String[] args) {
        JavaHowTo jht = new JavaHowTo();
        jht.sayHello();
        }
    }
     
      

  2.   

    这种错误我也碰到过,是编码问题引起的.
    因为JAVA的默认编码是16位的Unicode,如果本地调用的对象使用的是8位的编码方式,那传进去一定是乱码了,反过来也一样.
    解决的办法是把二者的编码强制转换成统一的.
    如:new String("需转换的目标文本串","GB2312");即把原本是Unicode编码的自符串转换成传
    GB2312传递进本地调用的对象中.
      

  3.   

    另外你也可以考虑不采用JAVA的String(包括跟String有关的,如BufferString等),而是直接使用byte数组来传递.
      

  4.   

    谢谢,已经解决!(中文Windows2000)to skyyoung(路人甲)你的方法一定不能使用中文的(我过去就是这么做的)做法:.C:jstr = (*env)->NewString(env, sum, strlen(sum)/2);//不使用UTF,且长度除2
    return(jstr);.java:String returned = new String (cReturned.getBytes("UnicodeLittleUned"));