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)