Android d-NDK開発の第三例として、文字列配列と中国語の文字化け問題を伝達します.

3753 ワード

回転:http://blog.csdn.net/geolo/article/details/5954272
一部の内容はネットから出ています.
     ここではAndroidのJNIの中国語の文字化け問題を説明します.  私たちが新しいnative.cを作る時.eclipseはnative.cにデフォルトでGBKです.私はjavaでGBKをUTF-8に変えてみましたが、相変わらず文字化けしています.だから、jniが帰ってきた中国語の文字列はどのタイプなのか分かりません.
     絶えず推測した結果、私達はnative.cを新築した時、native.cのコードタイプをUTF-8に変えました.このようにjavaでもコンパイルをしないでください.直接にシミュレータに中国語を表示することができます.
     ステップ:新規native.cを作成し、native.cファイル上で右クリックします.
 
Android NDKSample.java
    package com.geolo.android;  
    import android.app.Activity;  
    import android.os.Bundle;  
    import android.widget.TextView;  
    public class AndroidNDKSample extends Activity {  
        /** Called when the activity is first created. */  
        @Override  
        public void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState);  
            setContentView(R.layout.main);  
            TextView testNDK = (TextView)findViewById(R.id.test);  
            String strArrstr ="";  
            String strArr[] = getStringArray("to C string: ");  
            for(String s : strArr){  
                strArrstr += ("/n" + "my: " + s);  
            }  
            testNDK.setText(strArrstr);  
        }  
        static{  
            System.loadLibrary("native");  
        }  
        public native String[] getStringArray(String string);  
    }  
 
main.xml
    <?xml version="1.0" encoding="utf-8"?>  
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
        android:orientation="vertical"  
        android:layout_width="fill_parent"  
        android:layout_height="fill_parent"  
        >  
    <TextView    
        android:id="@+id/test"  
        android:layout_width="fill_parent"   
        android:layout_height="wrap_content"   
        android:text="@string/hello"  
        />  
    </LinearLayout>  
 
Android.mk
    LOCAL_PATH := $(call my-dir)  
    include $(CLEAR_VARS)  
    LOCAL_MODULE    := native  
    LOCAL_SRC_FILES := myNative.c  
    include $(BUILD_SHARED_LIBRARY)  
 
native.   (UTF-8フォーマットに変更する)
    #include <stdio.h>  
    #include <stdlib.h>  
    #include <string.h>  
    #include <jni.h>  
    #define ARRAY_LENGTH 5  
    jobjectArray Java_com_geolo_android_AndroidNDKSample_getStringArray(JNIEnv *env ,  
    jobject obj , jstring string){  
        jclass objClass = (*env)->FindClass(env , "java/lang/String");  
        jobjectArray texts = (*env)->NewObjectArray(env ,  
                                     (jsize)ARRAY_LENGTH , objClass , 0);  
        jstring jstr;  
        char* sa[] = {"HelloNDK!!" , "Geolo" , "JNI" , "  " , "   "};  
        int i = 0;  
        for(; i<ARRAY_LENGTH ; i++){  
           jstr = (*env)->NewStringUTF(env , sa[i]);  
           (*env)->SetObjectArrayElement(env, texts, i, jstr);//    jstring  
        }  
        return texts;  
    }  
 
      このルーチンは、前節のルーチンをさらに深化させるものであり、依然として伝達配列であるが、配列のベースクラスは文字列というオブジェクトデータタイプに置き換えられている.JavaプログラムはCプログラムに中国語文字を含む文字列を入力します.Cプログラムはこの文字列を処理していません.新しい文字列配列を開発してJavaプログラムに戻ります.中には漢字文字列が2つあります.
      JNIフレームは専用の文字列配列を定義していません.jobject Arayを使用しています.対象配列の基本はjclassです.jclassはJNIフレーム内の特有のタイプで、Java言語のクラスに相当します.このルーチンでは、FindClass()関数を介してJNIコンテキストでjava.lang.Stringのタイプを取得し、jclass変数に与えます.      ルーチンでは、長さ5のオブジェクト配列textsを定義し、所定のsa配列中の文字列をプログラム中に循環的に入れます.もちろん、前置条件は、NewStringUTF関数を使用して、C言語の文字列をjstringタイプに変換します.