public native String transferString(String mStrMSG); public native Object transferPerson(Person mPerson); |
Person.java
package com.duicky; /** * * * @author luxiaofeng <454162034@qq.com> * */ public class Person { private String name; private int age; public Person() { name = "" ; age = 0 ; } public String getName() { return name; } public void setName(String name) { this .name = name; } public int getAge() {
return age; } public void setAge( int age) { this .age = age; } @Override public String toString() { return "Person [name="
", age=" + age + "]" ; } } |
定义两个native方法, 第一个是 用来 测试传输字符串的的,第二个是用来测试传输自定义对象的。
Android.mk 文件
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_C_INCLUDES := $(LOCAL_PATH)/include LOCAL_LDLIBS += -L$(SYSROOT)/usr/lib -llog LOCAL_MODULE := NDK_07 LOCAL_SRC_FILES := \ TransmissionPerson.c \ TransmissionString.c include $(BUILD_SHARED_LIBRARY) |
老样子,不说了,你懂的。 如果不懂,嘎嘎,那就请点击Android.mk 文件 简介咯
JNI 中间层
TransmissionString.c // String 传输
#include <string.h> #include <jni.h> #include <android/log.h> JNIEnv* jniEnv; //----------------------------------------------------------------
//----------------------------------------------------------------
//----------------------------------------------------------------
jstring Java_com_duicky_Transmission_transferString( JNIEnv* env,jobject thiz,jstring msg ) { if (jniEnv == NULL) { jniEnv = env; } char data[128]; memset (data, 0, sizeof (data)); char *c_msg = NULL; c_msg = ( char *)(*jniEnv)->GetStringUTFChars(jniEnv, msg, 0); __android_log_print(ANDROID_LOG_INFO, "JNIMsg" , "C JNI ---- > %s" ,c_msg); return (*jniEnv)->NewStringUTF(jniEnv, "This is send by C JNI" ); } |
TransmissionPerson.c // 自定义对象 传输
#include <string.h> #include <jni.h> #include <android/log.h> extern JNIEnv* jniEnv; jclass Person; jobject mPerson; jmethodID getName; jmethodID setName; jmethodID getAge; jmethodID setAge; jmethodID toString; int InitPerson(); void ToString(); void GetName(); void GetAge(); void SetName(); void SetAge(); //----------------------------------------------------------------
//----------------------------------------------------------------
//----------------------------------------------------------------
jobject Java_com_duicky_Transmission_transferPerson( JNIEnv* env,jobject thiz,jobject person ) { if (jniEnv == NULL) { jniEnv = env; } if (Person == NULL || getName == NULL || setName == NULL || getAge == NULL || setAge == NULL || toString == NULL) {
if (1 != InitPerson()) { return NULL; } } mPerson = person; if (mPerson == NULL) { return NULL; } GetName(); GetAge(); ToString(); __android_log_print(ANDROID_LOG_INFO, "JNIMsg" , "Begin Modify mPerson .... " ); SetName(); SetAge(); ToString(); return mPerson; } //----------------------------------------------------------------
//----------------------------------------------------------------
//----------------------------------------------------------------
/** * 初始化 类、方法 */ int InitPerson() { __android_log_print(ANDROID_LOG_INFO, "JNIMsg" , "InitPerson Begin " ); if (jniEnv == NULL) { return 0; } if (Person == NULL) { Person = (*jniEnv)->FindClass(jniEnv, "com/duicky/Person" ); if (Person == NULL){ return -1; } __android_log_print(ANDROID_LOG_INFO, "JNIMsg" , "InitPerson Begin 2 ok" ); } if (getName == NULL) { getName = (*jniEnv)->GetMethodID(jniEnv, Person, "getName" , "()Ljava/lang/String;" );
if (getName == NULL) { (*jniEnv)->DeleteLocalRef(jniEnv, Person);
return -2; } __android_log_print(ANDROID_LOG_INFO, "JNIMsg" , "InitPerson Begin 4 ok" ); } if (setName == NULL) { setName = (*jniEnv)->GetMethodID(jniEnv, Person, "setName" , "(Ljava/lang/String;)V" );
if (setName == NULL) { (*jniEnv)->DeleteLocalRef(jniEnv, Person);
(*jniEnv)->DeleteLocalRef(jniEnv, getName);
return -2; } __android_log_print(ANDROID_LOG_INFO, "JNIMsg" , "InitPerson Begin 4 ok" ); } if (getAge == NULL) { getAge = (*jniEnv)->GetMethodID(jniEnv, Person, "getAge" , "()I" ); if (getAge == NULL) { (*jniEnv)->DeleteLocalRef(jniEnv, Person);
(*jniEnv)->DeleteLocalRef(jniEnv, getName);
(*jniEnv)->DeleteLocalRef(jniEnv, setName);
return -2; } __android_log_print(ANDROID_LOG_INFO, "JNIMsg" , "InitPerson Begin 4 ok" ); } if (setAge == NULL) { setAge = (*jniEnv)->GetMethodID(jniEnv, Person, "setAge" , "(I)V" ); if (setAge == NULL) { (*jniEnv)->DeleteLocalRef(jniEnv, Person);
(*jniEnv)->DeleteLocalRef(jniEnv, getName);
(*jniEnv)->DeleteLocalRef(jniEnv, setName);
(*jniEnv)->DeleteLocalRef(jniEnv, getAge);
return -2; } __android_log_print(ANDROID_LOG_INFO, "JNIMsg" , "InitPerson Begin 4 ok" ); } if (toString == NULL) { toString = (*jniEnv)->GetMethodID(jniEnv, Person, "toString" , "()Ljava/lang/String;" ); if (toString == NULL) { (*jniEnv)->DeleteLocalRef(jniEnv, Person);
(*jniEnv)->DeleteLocalRef(jniEnv, getName);
(*jniEnv)->DeleteLocalRef(jniEnv, setName);
(*jniEnv)->DeleteLocalRef(jniEnv, getAge);
(*jniEnv)->DeleteLocalRef(jniEnv, setAge);
return -2; } __android_log_print(ANDROID_LOG_INFO, "JNIMsg" , "InitPerson Begin 4 ok" ); } __android_log_print(ANDROID_LOG_INFO, "JNIMsg" , "InitPerson End" ); return 1; } /** * GetName 对应Person的getName方法 */ void GetName() { if (Person == NULL || getName == NULL) {
if (1 != InitPerson()){ return ; } } jstring jstr = NULL; char * cstr = NULL; //调用方法 jstr = (*jniEnv)->CallObjectMethod(jniEnv, mPerson, getName); cstr = ( char *) (*jniEnv)->GetStringUTFChars(jniEnv,jstr, 0); __android_log_print(ANDROID_LOG_INFO, "JNIMsg" , "getName ---- > %s" ,cstr ); //释放资源 (*jniEnv)->ReleaseStringUTFChars(jniEnv, jstr, cstr); (*jniEnv)->DeleteLocalRef(jniEnv, jstr); } /** * GetAge 对应Person的getName方法 */ void GetAge() { if (Person == NULL || getName == NULL) {
if (1 != InitPerson()){ return ; } } //调用方法 jint age = (*jniEnv)->CallIntMethod(jniEnv, mPerson, getAge); __android_log_print(ANDROID_LOG_INFO, "JNIMsg" , "getAge ---- > %d" ,age ); } /** * SetName 对应Person的setName方法 */ void SetName() { if (Person == NULL || setName == NULL) {
if (1 != InitPerson()){ return ; } } jstring jstr = (*jniEnv)->NewStringUTF(jniEnv, "Modify Name" ); //调用方法 (*jniEnv)->CallVoidMethod(jniEnv, mPerson, setName,jstr); (*jniEnv)->DeleteLocalRef(jniEnv, jstr); } int age = 20; /** * SetAge 对应Person的setAge方法 */ void SetAge() { if (Person == NULL || setAge == NULL) {
if (1 != InitPerson()){ return ; } } //调用方法 (*jniEnv)->CallVoidMethod(jniEnv, mPerson, setAge,age++); } /** * ToString 对应 Person 的 toString 方法 , 打印出相关信息 */ void ToString() { if (Person == NULL || toString == NULL) { if (1 != InitPerson()){ return ; } } jstring jstr = NULL; char * cstr = NULL; //调用方法 jstr = (*jniEnv)->CallObjectMethod(jniEnv, mPerson, toString); cstr = ( char *) (*jniEnv)->GetStringUTFChars(jniEnv,jstr, 0); __android_log_print(ANDROID_LOG_INFO, "JNIMsg" , "C JNI toString ---- > %s" ,cstr ); (*jniEnv)->ReleaseStringUTFChars(jniEnv, jstr, cstr); (*jniEnv)->DeleteLocalRef(jniEnv, jstr); } |