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
main.xml
Android.mk
native. (UTF-8フォーマットに変更する)
このルーチンは、前節のルーチンをさらに深化させるものであり、依然として伝達配列であるが、配列のベースクラスは文字列というオブジェクトデータタイプに置き換えられている.JavaプログラムはCプログラムに中国語文字を含む文字列を入力します.Cプログラムはこの文字列を処理していません.新しい文字列配列を開発してJavaプログラムに戻ります.中には漢字文字列が2つあります.
JNIフレームは専用の文字列配列を定義していません.jobject Arayを使用しています.対象配列の基本はjclassです.jclassはJNIフレーム内の特有のタイプで、Java言語のクラスに相当します.このルーチンでは、FindClass()関数を介してJNIコンテキストでjava.lang.Stringのタイプを取得し、jclass変数に与えます. ルーチンでは、長さ5のオブジェクト配列textsを定義し、所定のsa配列中の文字列をプログラム中に循環的に入れます.もちろん、前置条件は、NewStringUTF関数を使用して、C言語の文字列をjstringタイプに変換します.
一部の内容はネットから出ています.
ここでは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タイプに変換します.