Android NDK 的学习之旅-----数据传输

 
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);
  
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值