当前位置:操作系统 > 安卓/Android >>

基于Android NDK的学习之旅-----数据传输二(引用数据类型)

  接着上篇文章继续讲。主要关于引用类型的数据传输,本文将介绍字符串传输和自定义对象的传输。

 

1、主要流程
1、 String 字符串传输

a)        上层定义一个native的方法,需要一个String 参数,返回一个String

b)       JNI对应上层的方法,打印出上层传输下来的String数据,并返回处理String数据

c)        上层 收到 native 方法 返回的 值,在UI中显示出来

 

 

2、 自定义对象的传输

a)        自定义一个对象Person

b)       上层定义一个native方法,参数Person,返回值Person

c)        JNI接收对象,打印出相关信息数据

d)       JNI 修改Person 对象数据,并返回到上层

e)        上层接收到数据后 在UI显示出来

 

 

2设计实现
1、 界面设计如下:

\

老老样子,很搓,嘿嘿

代码不在这贴出了,有需要的兄弟直接到文章结束部分下载。

2、 关键代码说明

 

Java 上层:

view plain
public nativeString transferString(String mStrMSG); 
public nativeObject  transferPerson(Person mPerson);       
 
Person.java

view plain
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 文件

     

view plain
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 传输

    

view plain
#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 // 自定义对象 传输

 

view plain
#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(); 
 
   

补充:移动开发 , Android ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,