ndroid JNI 提供了很强大的支持,不仅可以采用基本类型做为参数和返回值,同时也支持自定义对象做为参数和返回值,以下举例说明。

一、定义作为输入和返回的自定义类 (仅提供两个简单类型和一个打印函数)

  1. package com.example.jniexample;
  2. import android.util.Log;
  3. public class JNIParam {
  4. public int mInt;
  5. public String mString;
  6. JNIParam(){
  7. mInt    = 0;
  8. mString = "0";
  9. }
  10. public void print(String tag){
  11. Log.d(tag, String.format("print: mInt=%d, mString=%s", mInt, mString));
  12. }
  13. }

二. 定义和JNI通信的java封装

功能:测试输入参数和返回值都为自定义对象的本地方法,同时提供必要的调试打印

  1. package com.example.jniexample;
  2. public class JNIParamTest {
  3. private final String TAG = "JNIParamTest";
  4. static {
  5. System.loadLibrary("JNIParamTest");
  6. };
  7. public void runParamTest(){
  8. JNIParam paramIn = new JNIParam();
  9. paramIn.print(TAG);
  10. JNIParam paramOut = doTest(paramIn);
  11. if( paramOut != null ) paramOut.print(TAG);
  12. }
  13. //JNI
  14. private native JNIParam doTest(JNIParam paramIn);
  15. }

三、实现JNI的本地实现

a. 头文件 (JNIParamTest.h)

  1. /* DO NOT EDIT THIS FILE - it is machine generated */
  2. #include <jni.h>
  3. /* Header for class com_example_jniexample_JNIParamTest */
  4. #ifndef _Included_com_example_jniexample_JNIParamTest
  5. #define _Included_com_example_jniexample_JNIParamTest
  6. #ifdef __cplusplus
  7. extern "C" {
  8. #endif
  9. /*
  10. * Class:     com_example_jniexample_JNIParamTest
  11. * Method:    doTest
  12. * Signature: (Lcom/example/jniexample/JNIParam;)Lcom/example/jniexample/JNIParam;
  13. */
  14. JNIEXPORT jobject JNICALL Java_com_example_jniexample_JNIParamTest_doTest
  15. (JNIEnv *, jobject, jobject);
  16. #ifdef __cplusplus
  17. }
  18. #endif
  19. #endif

b. c文件 (JNIParamTest.c)

  1. #include "JNIParamTest.h"
  2. #include "android/log.h"
  3. #define TAG  "JNI_ParamTest"
  4. #define LOGD(fmt, args...) __android_log_print(ANDROID_LOG_DEBUG, TAG, fmt, ##args)
  5. /*
  6. * Class:     com_example_jniexample_JNIParamTest
  7. * Method:    doTest
  8. * Signature: (Lcom/example/jniexample/JNIParam;)Lcom/example/jniexample/JNIParam;
  9. */
  10. JNIEXPORT jobject JNICALL Java_com_example_jniexample_JNIParamTest_doTest
  11. (JNIEnv *env, jobject thiz, jobject paramIn)
  12. {
  13. jclass paramInClass = (*env)->GetObjectClass(env, paramIn);
  14. if( paramInClass){
  15. jboolean iscopy;
  16. jfieldID intId = (*env)->GetFieldID(env, paramInClass, "mInt", "I");
  17. jint num = (int)(*env)->GetIntField(env, paramIn, intId);
  18. LOGD("num = %d", num);
  19. jfieldID strId = (*env)->GetFieldID(env, paramInClass, "mString", "Ljava/lang/String;");
  20. jstring str = (jstring)(*env)->GetObjectField(env, paramIn, strId);
  21. const char *locstr = (*env)->GetStringUTFChars(env, str, &iscopy);
  22. LOGD("str = %s", locstr);
  23. (*env)->ReleaseStringUTFChars(env, str, locstr);
  24. }
  25. jclass cls = (*env)->FindClass(env, "com/example/jniexample/JNIParam");
  26. jmethodID id = (*env)->GetMethodID(env, cls, "<init>", "()V");
  27. jobject paramOut = (*env)->NewObjectA(env, cls, id, 0);
  28. jfieldID  intId = (*env)->GetFieldID(env, cls, "mInt", "I");
  29. (*env)->SetIntField(env, paramOut, intId, 1);
  30. jfieldID  strId = (*env)->GetFieldID(env, cls, "mString", "Ljava/lang/String;");
  31. (*env)->SetObjectField(env, paramOut, strId, (jstring)(*env)->NewStringUTF(env, "1"));
  32. return paramOut;
  33. }

四、提供一个测试环境

  1. package com.example.jniexample;
  2. import android.os.Bundle;
  3. import android.app.Activity;
  4. import android.view.Menu;
  5. public class JNIExample extends Activity {
  6. @Override
  7. public void onCreate(Bundle savedInstanceState) {
  8. super.onCreate(savedInstanceState);
  9. setContentView(R.layout.activity_jniexample);
  10. JNIParamTest test = new JNIParamTest();
  11. test.runParamTest();
  12. }
  13. @Override
  14. public boolean onCreateOptionsMenu(Menu menu) {
  15. getMenuInflater().inflate(R.menu.activity_jniexample, menu);
  16. return true;
  17. }
  18. }

实现了一个Activity, 启动就调用

五、测试结果: (logcat 查看)

  1. D/JNIParamTest( 6135): print: mInt=0, mString=0
  2. D/JNI_ParamTest( 6135): num = 0
  3. D/JNI_ParamTest( 6135): str = 0
  4. D/JNIParamTest( 6135): print: mInt=1, mString=1

转载于:https://www.cnblogs.com/Free-Thinker/p/6155158.html

Android JNI 自定义对象为参数和返回值相关推荐

  1. Java笔记-JNI中简单的参数与返回值处理

    目录 基本概念 代码及演示 基本概念 此篇博文记录了JNI的基本规范,与使用: https://blog.csdn.net/qq78442761/article/details/94849374 在本 ...

  2. py6_Python 内置函数/普通自定义函数 及参数和返回值

    ################################################## 目录 活动简介 Python 函数参数 如何定义一个函数 示例定义一个无参函数 形参和实参的概念 ...

  3. Android调用远程Service的参数和返回值都需要实现Parcelable接口

    import android.os.Parcel; import android.os.Parcelable; public class Person implements Parcelable{ p ...

  4. 论DATASNAP远程方法支持自定义对象作参数

    论DATASNAP远程方法支持自定义对象作参数 DATASNAP远程方法已经可以支持自定义对象作参数,这是非常方便的功能. 1)自定义对象 type TMyInfo = class(TObject) ...

  5. java分布式对象——远程方法中的参数和返回值+远程对象激活

    [0]README 1)本文文字描述转自 core java volume 2, 旨在学习 java分布式对象--远程方法中的参数和返回值+远程对象激活 的相关知识: [1]远程方法中的参数和返回值 ...

  6. 本地方法(JNI)——数值参数与返回值

    [0]README 1) 本文部分文字描述 转自 core java volume 2 , 旨在理解 本地方法(JNI)--数值参数与返回值 的基础知识 : 2) for source code, p ...

  7. Lambda表达式有参数有返回值的练习(自定义接口)

    package com.learn.demo06.Lambda;/*Lambda表达式有参数有返回值的练习需求:给定一个计算器Calculator接口,内含抽象方法calc可以将两个int数字相加得到 ...

  8. 【C++】函数 指针类型参数 与 引用类型参数 对比 ( 修改外部变量需要传入的参数要求 | 参数作返回值 )

    文章目录 I . 博客总结 . 指针与引用类型参数 II . 指针作为参数和返回值 III . 引用参数简介 IV . 引用作为参数和返回值 I . 博客总结 . 指针与引用类型参数 1 . 讨论问题 ...

  9. java中类作为成员变量类型使用、接口作为成员变量类型使用、接口作为方法的参数或返回值使用

    类作为成员变量类型使用: 自定义的类也可以作为成员变量使用,如: // 1.创建一个电脑角色的类: public class Computer{private String computername; ...

  10. const 修饰函数参数,返回值,函数体,保护数据

    一.const 介绍 1.const 定义 const 修饰的数据类型是指常类型,常类型的变量或对象的值是不能被更新的. 2.const 目的 const 推出的初始目的,正是为了取代预编译指令,消除 ...

最新文章

  1. 导购网站 服务器,导购网站云服务器配置
  2. 烂大街的缓存穿透、缓存击穿和缓存雪崩,你真的懂了?
  3. 用.NET CF进行HardReset?
  4. c语言格式化字符漏洞,格式化字符串漏洞题目练习
  5. C# try catch finally 执行
  6. 剑指 offer 编程题 C++ 版总结(中)
  7. winform 统计大量数据重复的元素个数_DAY10——推断统计之概率与概率分布:常见的离散型概率分布...
  8. 华为云平台创建产品+注册设备
  9. Linux内核编译与安装[转]
  10. 单片机原理及应用实验报告
  11. 计算机组成原理中的DUBS是,[转帖]实验室名称中英文对照大整理
  12. 工业互联网,姓工,名互
  13. 《GPU编程与CG语言之阳春白雪下里巴人》 读书笔记2
  14. STM32 keil中__IO得意思
  15. 斯坦福大学的低码率音频编码博士论文
  16. web入门 命令执行 web29-web41
  17. GBase基本查询操作
  18. Jboss与jdk版本不兼容问题
  19. 一起设计一个Android倒计时组件
  20. idea ctrl+alt+向左箭头不能用

热门文章

  1. VirtualBox不能共享剪贴板,有两种情形
  2. C处理Python返回的字串代码
  3. java解析获得birt报表的数据_java pojo实体类做birt报表数据源
  4. tns无监听程序_成ORA-12560: TNS: 协议适配器错误的问题的原因
  5. wpf获取当前窗体的屏幕坐标
  6. 怎么下载linux历史文件,快速学习Linux-Linux历史
  7. ionic 网站放在服务器,Ionic4 服务器插件-服务器Httpd - Ionic Native
  8. python无法调用安装的包_无法在Windows 10上使用python2.7/MINGW安装pyslalib软件包
  9. GetCommandLine()和CommandLineToArgvW()
  10. GUID和UUID、CLSID、IID 区别及联系