当前位置:   article > 正文

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

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、  关键代码说明
Transmission.java

  1. package com.duicky;
  2. /**
  3. *
  4. * <p>
  5. * Title: aa.java
  6. * </p>
  7. * <p>
  8. * E-Mail: 176291935@qq.com
  9. * </p>
  10. * <p>
  11. * QQ: 176291935
  12. * </p>
  13. * <p>
  14. * Http: iaiai.iteye.com
  15. * </p>
  16. * <p>
  17. * Create time: 2011-9-19
  18. * </p>
  19. *
  20. * @author 丸子
  21. * @version 0.0.1
  22. */
  23. public class Transmission {
  24. private static final String libSoName = "NDK_07";
  25. public native String transferString(String mStrMSG);
  26. public native Object transferPerson(Person mPerson);
  27. /**
  28. * 载入JNI生成的so库文件
  29. */
  30. static {
  31. System.loadLibrary(libSoName);
  32. }
  33. }

 MainActivity.java

  1. package com.duicky;
  2. import android.app.Activity;
  3. import android.content.Context;
  4. import android.os.Bundle;
  5. import android.view.View;
  6. import android.view.View.OnClickListener;
  7. import android.widget.Button;
  8. import android.widget.TextView;
  9. /**
  10. *
  11. * <p>
  12. * Title: MainActivity.java
  13. * </p>
  14. * <p>
  15. * E-Mail: 176291935@qq.com
  16. * </p>
  17. * <p>
  18. * QQ: 176291935
  19. * </p>
  20. * <p>
  21. * Http: iaiai.iteye.com
  22. * </p>
  23. * <p>
  24. * Create time: 2011-9-19
  25. * </p>
  26. *
  27. * @author 丸子
  28. * @version 0.0.1
  29. */
  30. public class MainActivity extends Activity {
  31. //也就是你mk配置文件中的 LOCAL_MODULE := NDK_06
  32. private Context mContext = null;
  33. private Transmission mTransmission = null;
  34. private Button btnString = null;
  35. private Button btnPerson = null;
  36. private TextView tvString = null;
  37. private TextView tvPerson = null;
  38. /** Called when the activity is first created. */
  39. @Override
  40. public void onCreate(Bundle savedInstanceState) {
  41. super.onCreate(savedInstanceState);
  42. setContentView(R.layout.main);
  43. mContext = this;
  44. mTransmission = new Transmission();
  45. initViews();
  46. }
  47. /**
  48. * 初始化控件
  49. */
  50. private void initViews() {
  51. btnString = (Button) findViewById(R.id.btn_string);
  52. btnPerson = (Button) findViewById(R.id.btn_person);
  53. tvString = (TextView) findViewById(R.id.tv_string);
  54. tvPerson = (TextView) findViewById(R.id.tv_person);
  55. btnString.setOnClickListener(new MyOnClickListener());
  56. btnPerson.setOnClickListener(new MyOnClickListener());
  57. }
  58. private void transferString() {
  59. String mStrMSg = mTransmission.transferString(" This Message come from Java ");
  60. LogUtils.printWithSystemOut(mStrMSg);
  61. tvString.setText(mStrMSg);
  62. }
  63. private void transferPerson() {
  64. Person mPerson = new Person();
  65. mPerson.setAge(10);
  66. mPerson.setName("duicky");
  67. Person mPerson1 = (Person)mTransmission.transferPerson(mPerson);
  68. if(mPerson1 == null) {
  69. LogUtils.printWithSystemOut("error");
  70. tvPerson.setText("传递出现错误,请重试");
  71. return;
  72. }
  73. LogUtils.printWithSystemOut(mPerson1.toString());
  74. tvPerson.setText("Java --- > "+mPerson1.toString());
  75. }
  76. class MyOnClickListener implements OnClickListener{
  77. @Override
  78. public void onClick(View v) {
  79. switch(v.getId()) {
  80. case R.id.btn_string:
  81. transferString();
  82. break;
  83. case R.id.btn_person:
  84. transferPerson();
  85. break;
  86. }
  87. }
  88. }
  89. }

 TransmissionPerson.c

  1. #include <string.h>
  2. #include <jni.h>
  3. #include <android/log.h>
  4. extern JNIEnv* jniEnv;
  5. jclass Person;
  6. jobject mPerson;
  7. jmethodID getName;
  8. jmethodID setName;
  9. jmethodID getAge;
  10. jmethodID setAge;
  11. jmethodID toString;
  12. int InitPerson();
  13. void ToString();
  14. void GetName();
  15. void GetAge();
  16. void SetName();
  17. void SetAge();
  18. //----------------------------------------------------------------
  19. //----------------------------------------------------------------
  20. //----------------------------------------------------------------
  21. jobject
  22. Java_com_duicky_Transmission_transferPerson( JNIEnv* env,jobject thiz,jobject person )
  23. {
  24. if(jniEnv == NULL) {
  25. jniEnv = env;
  26. }
  27. if (Person == NULL || getName == NULL || setName == NULL || getAge == NULL
  28. || setAge == NULL || toString == NULL) {
  29. if (1 != InitPerson()) {
  30. return NULL;
  31. }
  32. }
  33. mPerson = person;
  34. if(mPerson == NULL) {
  35. return NULL;
  36. }
  37. GetName();
  38. GetAge();
  39. ToString();
  40. __android_log_print(ANDROID_LOG_INFO, "JNIMsg", "Begin Modify mPerson .... " );
  41. SetName();
  42. SetAge();
  43. ToString();
  44. return mPerson;
  45. }
  46. //----------------------------------------------------------------
  47. //----------------------------------------------------------------
  48. //----------------------------------------------------------------
  49. /**
  50. * 初始化 类、方法
  51. */
  52. int InitPerson() {
  53. __android_log_print(ANDROID_LOG_INFO, "JNIMsg", "InitPerson Begin " );
  54. if(jniEnv == NULL) {
  55. return 0;
  56. }
  57. if(Person == NULL) {
  58. Person = (*jniEnv)->FindClass(jniEnv,"com/duicky/Person");
  59. if(Person == NULL){
  60. return -1;
  61. }
  62. __android_log_print(ANDROID_LOG_INFO, "JNIMsg", "InitPerson Begin 2 ok" );
  63. }
  64. if (getName == NULL) {
  65. getName = (*jniEnv)->GetMethodID(jniEnv, Person, "getName","()Ljava/lang/String;");
  66. if (getName == NULL) {
  67. (*jniEnv)->DeleteLocalRef(jniEnv, Person);
  68. return -2;
  69. }
  70. __android_log_print(ANDROID_LOG_INFO, "JNIMsg", "InitPerson Begin 4 ok" );
  71. }
  72. if (setName == NULL) {
  73. setName = (*jniEnv)->GetMethodID(jniEnv, Person, "setName","(Ljava/lang/String;)V");
  74. if (setName == NULL) {
  75. (*jniEnv)->DeleteLocalRef(jniEnv, Person);
  76. (*jniEnv)->DeleteLocalRef(jniEnv, getName);
  77. return -2;
  78. }
  79. __android_log_print(ANDROID_LOG_INFO, "JNIMsg", "InitPerson Begin 4 ok" );
  80. }
  81. if (getAge == NULL) {
  82. getAge = (*jniEnv)->GetMethodID(jniEnv, Person, "getAge","()I");
  83. if (getAge == NULL) {
  84. (*jniEnv)->DeleteLocalRef(jniEnv, Person);
  85. (*jniEnv)->DeleteLocalRef(jniEnv, getName);
  86. (*jniEnv)->DeleteLocalRef(jniEnv, setName);
  87. return -2;
  88. }
  89. __android_log_print(ANDROID_LOG_INFO, "JNIMsg", "InitPerson Begin 4 ok" );
  90. }
  91. if (setAge == NULL) {
  92. setAge = (*jniEnv)->GetMethodID(jniEnv, Person, "setAge","(I)V");
  93. if (setAge == NULL) {
  94. (*jniEnv)->DeleteLocalRef(jniEnv, Person);
  95. (*jniEnv)->DeleteLocalRef(jniEnv, getName);
  96. (*jniEnv)->DeleteLocalRef(jniEnv, setName);
  97. (*jniEnv)->DeleteLocalRef(jniEnv, getAge);
  98. return -2;
  99. }
  100. __android_log_print(ANDROID_LOG_INFO, "JNIMsg", "InitPerson Begin 4 ok" );
  101. }
  102. if (toString == NULL) {
  103. toString = (*jniEnv)->GetMethodID(jniEnv, Person, "toString","()Ljava/lang/String;");
  104. if (toString == NULL) {
  105. (*jniEnv)->DeleteLocalRef(jniEnv, Person);
  106. (*jniEnv)->DeleteLocalRef(jniEnv, getName);
  107. (*jniEnv)->DeleteLocalRef(jniEnv, setName);
  108. (*jniEnv)->DeleteLocalRef(jniEnv, getAge);
  109. (*jniEnv)->DeleteLocalRef(jniEnv, setAge);
  110. return -2;
  111. }
  112. __android_log_print(ANDROID_LOG_INFO, "JNIMsg", "InitPerson Begin 4 ok" );
  113. }
  114. __android_log_print(ANDROID_LOG_INFO, "JNIMsg", "InitPerson End" );
  115. return 1;
  116. }
  117. /**
  118. * GetName 对应Person的getName方法
  119. */
  120. void GetName() {
  121. if(Person == NULL || getName == NULL) {
  122. if(1 != InitPerson()){
  123. return;
  124. }
  125. }
  126. jstring jstr = NULL;
  127. char* cstr = NULL;
  128. //调用方法
  129. jstr = (*jniEnv)->CallObjectMethod(jniEnv, mPerson, getName);
  130. cstr = (char*) (*jniEnv)->GetStringUTFChars(jniEnv,jstr, 0);
  131. __android_log_print(ANDROID_LOG_INFO, "JNIMsg", "getName ---- > %s",cstr );
  132. //释放资源
  133. (*jniEnv)->ReleaseStringUTFChars(jniEnv, jstr, cstr);
  134. (*jniEnv)->DeleteLocalRef(jniEnv, jstr);
  135. }
  136. /**
  137. * GetAge 对应Person的getName方法
  138. */
  139. void GetAge() {
  140. if(Person == NULL || getName == NULL) {
  141. if(1 != InitPerson()){
  142. return;
  143. }
  144. }
  145. //调用方法
  146. jint age = (*jniEnv)->CallIntMethod(jniEnv, mPerson, getAge);
  147. __android_log_print(ANDROID_LOG_INFO, "JNIMsg", "getAge ---- > %d",age );
  148. }
  149. /**
  150. * SetName 对应Person的setName方法
  151. */
  152. void SetName() {
  153. if(Person == NULL || setName == NULL) {
  154. if(1 != InitPerson()){
  155. return;
  156. }
  157. }
  158. jstring jstr = (*jniEnv)->NewStringUTF(jniEnv, "Modify Name");
  159. //调用方法
  160. (*jniEnv)->CallVoidMethod(jniEnv, mPerson, setName,jstr);
  161. (*jniEnv)->DeleteLocalRef(jniEnv, jstr);
  162. }
  163. int age = 20;
  164. /**
  165. * SetAge 对应Person的setAge方法
  166. */
  167. void SetAge() {
  168. if(Person == NULL || setAge == NULL) {
  169. if(1 != InitPerson()){
  170. return;
  171. }
  172. }
  173. //调用方法
  174. (*jniEnv)->CallVoidMethod(jniEnv, mPerson, setAge,age++);
  175. }
  176. /**
  177. * ToString 对应 Person 的 toString 方法 , 打印出相关信息
  178. */
  179. void ToString() {
  180. if(Person == NULL || toString == NULL) {
  181. if(1 != InitPerson()){
  182. return;
  183. }
  184. }
  185. jstring jstr = NULL;
  186. char* cstr = NULL;
  187. //调用方法
  188. jstr = (*jniEnv)->CallObjectMethod(jniEnv, mPerson, toString);
  189. cstr = (char*) (*jniEnv)->GetStringUTFChars(jniEnv,jstr, 0);
  190. __android_log_print(ANDROID_LOG_INFO, "JNIMsg", "C JNI toString ---- > %s",cstr );
  191. (*jniEnv)->ReleaseStringUTFChars(jniEnv, jstr, cstr);
  192. (*jniEnv)->DeleteLocalRef(jniEnv, jstr);
  193. }

 TransmissionString.c

  1. #include <string.h>
  2. #include <jni.h>
  3. #include <android/log.h>
  4. JNIEnv* jniEnv;
  5. jstring
  6. Java_com_duicky_Transmission_transferString( JNIEnv* env,jobject thiz,jstring msg )
  7. {
  8. if(jniEnv == NULL) {
  9. jniEnv = env;
  10. }
  11. char data[128];
  12. memset(data, 0, sizeof(data));
  13. char *c_msg = NULL;
  14. c_msg = (char *)(*jniEnv)->GetStringUTFChars(jniEnv, msg, 0);
  15. __android_log_print(ANDROID_LOG_INFO, "JNIMsg", "C JNI ---- > %s",c_msg);
  16. return (*jniEnv)->NewStringUTF(jniEnv, "This is send by C JNI");
  17. }

 摘自:http://www.iteye.com/topic/1114882

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/133255
推荐阅读
相关标签
  

闽ICP备14008679号