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)