Android JNI Static method

1.JNITest

package com.jnitest;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

public class JniTest extends Activity {
	Book mBook;
	static {
        System.loadLibrary("hello-jni");
    }
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        //get String from c
        Log.d("JniTest",stringFromJNI());
        //get Object from c
        mBook = objGetBook();
        Log.d("JniTest",String.valueOf(mBook.mCount));
        Log.d("JniTest",mBook.getName());    
        //String  to char *之间转化
        //Log.d("JniTest",stringCharTest("String from java!!!"));
        
    }
    
    
    public native String  stringFromJNI();
    public native Book  objGetBook();
    public native String  stringCharTest(String strJava);
}

2.Book

package com.jnitest;

public class Book {
	public int mCount;
	private String mName;
	
	void setCount(int count){
		mCount = count;
	}
	
	void setName(String name){
		mName = name;
	}
	
	String getName(){
		return mName;
	}

}

  3.JNI file

#include <string.h>
#include <jni.h>
#include <android/log.h>

#define LOG_TAG "LOG_JNI"
#define LOGD(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)

//返回字符串
jstring Java_com_jnitest_JniTest_stringFromJNI(JNIEnv* env, jobject thiz) {
	return (*env)->NewStringUTF(env, "Hello from c,JNI !");
}

//返回java 对象
jobject Java_com_jnitest_JniTest_objGetBook(JNIEnv* env, jobject thiz) {
	jclass clazz = (*env)->FindClass(env, "com/jnitest/Book");
	if (clazz == 0)
		return 0;
	//分配空间
	jobject obj = (*env)->AllocObject(env, clazz);
	//获得域count
	jfieldID fid_id = (*env)->GetFieldID(env, clazz, "mCount", "I");
	if (fid_id == 0)
		return 0;
	//获得域name
	jfieldID fid_name = (*env)->GetFieldID(env, clazz, "mName",
			"Ljava/lang/String;");
	if (fid_name == 0)
		return 0;
	//设置域
	(*env)->SetIntField(env, obj, fid_id, 3);
	(*env)->SetObjectField(env, obj, fid_name,
			((*env))->NewStringUTF(env, "Dream"));

	return obj;
}

//String  to char *之间转化
char*
Java_com_jnitest_JniTest_stringToCharTest(JNIEnv* env, jobject thiz,
		jstring stringJava) {
	//char* string_Java=(char*) (*env)->GetStringUTFChars(env, stringJava, JNI_FALSE);
	//(*env)->ReleaseStringUTFChars(env, stringJava,string_Java);
	//return (*env)->NewStringUTF(env, "String to char *!!!");
	char* rtn = NULL;
	jclass clsstring = (*env)->FindClass(env, "java/lang/String");
	jstring strencode = (*env)->NewStringUTF(env, "utf-8");
	jmethodID mid = (*env)->GetMethodID(env, clsstring, "getBytes",
			"(Ljava/lang/String;)[B");
	jbyteArray barr = (jbyteArray)(*env)->CallObjectMethod(env, stringJava,
			mid, strencode);
	jsize alen = (*env)->GetArrayLength(env, barr);
	jbyte* ba = (*env)->GetByteArrayElements(env, barr, JNI_FALSE);
	if (alen > 0) {
		rtn = (char*) malloc(alen + 1);
		memcpy(rtn, ba, alen);
		rtn[alen] = 0;
	}

	LOGD(rtn);
	(*env)->ReleaseByteArrayElements(env, barr, ba, 0);
	return rtn;
}
//char* to jstring
/*
 jstring stoJstring(JNIEnv* env, const char* pat)
 {
 jclass strClass = env->FindClass("Ljava/lang/String;");
 jmethodID ctorID = env->GetMethodID(strClass, "<init>", "([BLjava/lang/String;)V");
 jbyteArray bytes = env->NewByteArray(strlen(pat));
 env->SetByteArrayRegion(bytes, 0, strlen(pat), (jbyte*)pat);
 jstring encoding = env->NewStringUTF("utf-8");
 return (jstring)env->NewObject(strClass, ctorID, bytes, encoding);
 } */

  4.makefile

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := hello-jni
LOCAL_SRC_FILES := hello-jni.c

LOCAL_LDLIBS += -llog

include $(BUILD_SHARED_LIBRARY)

  

posted @ 2012-04-08 19:09  cornellbox  阅读(1686)  评论(0编辑  收藏  举报