现在的位置: 首页 > 综合 > 正文

Android NDK 的学习之旅—–数据传输

2014年01月02日 ⁄ 综合 ⁄ 共 7359字 ⁄ 字号 评论关闭

 

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="
+ 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);
  
}

抱歉!评论已关闭.