Android JNI 自定义对象为参数和返回值
ndroid JNI 提供了很强大的支持,不仅可以采用基本类型做为参数和返回值,同时也支持自定义对象做为参数和返回值,以下举例说明。
一、定义作为输入和返回的自定义类 (仅提供两个简单类型和一个打印函数)
- package com.example.jniexample;
- import android.util.Log;
- public class JNIParam {
- public int mInt;
- public String mString;
- JNIParam(){
- mInt = 0;
- mString = "0";
- }
- public void print(String tag){
- Log.d(tag, String.format("print: mInt=%d, mString=%s", mInt, mString));
- }
- }
二. 定义和JNI通信的java封装
功能:测试输入参数和返回值都为自定义对象的本地方法,同时提供必要的调试打印
- package com.example.jniexample;
- public class JNIParamTest {
- private final String TAG = "JNIParamTest";
- static {
- System.loadLibrary("JNIParamTest");
- };
- public void runParamTest(){
- JNIParam paramIn = new JNIParam();
- paramIn.print(TAG);
- JNIParam paramOut = doTest(paramIn);
- if( paramOut != null ) paramOut.print(TAG);
- }
- //JNI
- private native JNIParam doTest(JNIParam paramIn);
- }
三、实现JNI的本地实现
a. 头文件 (JNIParamTest.h)
- /* DO NOT EDIT THIS FILE - it is machine generated */
- #include <jni.h>
- /* Header for class com_example_jniexample_JNIParamTest */
- #ifndef _Included_com_example_jniexample_JNIParamTest
- #define _Included_com_example_jniexample_JNIParamTest
- #ifdef __cplusplus
- extern "C" {
- #endif
- /*
- * Class: com_example_jniexample_JNIParamTest
- * Method: doTest
- * Signature: (Lcom/example/jniexample/JNIParam;)Lcom/example/jniexample/JNIParam;
- */
- JNIEXPORT jobject JNICALL Java_com_example_jniexample_JNIParamTest_doTest
- (JNIEnv *, jobject, jobject);
- #ifdef __cplusplus
- }
- #endif
- #endif
b. c文件 (JNIParamTest.c)
- #include "JNIParamTest.h"
- #include "android/log.h"
- #define TAG "JNI_ParamTest"
- #define LOGD(fmt, args...) __android_log_print(ANDROID_LOG_DEBUG, TAG, fmt, ##args)
- /*
- * Class: com_example_jniexample_JNIParamTest
- * Method: doTest
- * Signature: (Lcom/example/jniexample/JNIParam;)Lcom/example/jniexample/JNIParam;
- */
- JNIEXPORT jobject JNICALL Java_com_example_jniexample_JNIParamTest_doTest
- (JNIEnv *env, jobject thiz, jobject paramIn)
- {
- jclass paramInClass = (*env)->GetObjectClass(env, paramIn);
- if( paramInClass){
- jboolean iscopy;
- jfieldID intId = (*env)->GetFieldID(env, paramInClass, "mInt", "I");
- jint num = (int)(*env)->GetIntField(env, paramIn, intId);
- LOGD("num = %d", num);
- jfieldID strId = (*env)->GetFieldID(env, paramInClass, "mString", "Ljava/lang/String;");
- jstring str = (jstring)(*env)->GetObjectField(env, paramIn, strId);
- const char *locstr = (*env)->GetStringUTFChars(env, str, &iscopy);
- LOGD("str = %s", locstr);
- (*env)->ReleaseStringUTFChars(env, str, locstr);
- }
- jclass cls = (*env)->FindClass(env, "com/example/jniexample/JNIParam");
- jmethodID id = (*env)->GetMethodID(env, cls, "<init>", "()V");
- jobject paramOut = (*env)->NewObjectA(env, cls, id, 0);
- jfieldID intId = (*env)->GetFieldID(env, cls, "mInt", "I");
- (*env)->SetIntField(env, paramOut, intId, 1);
- jfieldID strId = (*env)->GetFieldID(env, cls, "mString", "Ljava/lang/String;");
- (*env)->SetObjectField(env, paramOut, strId, (jstring)(*env)->NewStringUTF(env, "1"));
- return paramOut;
- }
四、提供一个测试环境
- package com.example.jniexample;
- import android.os.Bundle;
- import android.app.Activity;
- import android.view.Menu;
- public class JNIExample extends Activity {
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_jniexample);
- JNIParamTest test = new JNIParamTest();
- test.runParamTest();
- }
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- getMenuInflater().inflate(R.menu.activity_jniexample, menu);
- return true;
- }
- }
实现了一个Activity, 启动就调用
五、测试结果: (logcat 查看)
- D/JNIParamTest( 6135): print: mInt=0, mString=0
- D/JNI_ParamTest( 6135): num = 0
- D/JNI_ParamTest( 6135): str = 0
- D/JNIParamTest( 6135): print: mInt=1, mString=1
转载于:https://www.cnblogs.com/Free-Thinker/p/6155158.html
Android JNI 自定义对象为参数和返回值相关推荐
- Java笔记-JNI中简单的参数与返回值处理
目录 基本概念 代码及演示 基本概念 此篇博文记录了JNI的基本规范,与使用: https://blog.csdn.net/qq78442761/article/details/94849374 在本 ...
- py6_Python 内置函数/普通自定义函数 及参数和返回值
################################################## 目录 活动简介 Python 函数参数 如何定义一个函数 示例定义一个无参函数 形参和实参的概念 ...
- Android调用远程Service的参数和返回值都需要实现Parcelable接口
import android.os.Parcel; import android.os.Parcelable; public class Person implements Parcelable{ p ...
- 论DATASNAP远程方法支持自定义对象作参数
论DATASNAP远程方法支持自定义对象作参数 DATASNAP远程方法已经可以支持自定义对象作参数,这是非常方便的功能. 1)自定义对象 type TMyInfo = class(TObject) ...
- java分布式对象——远程方法中的参数和返回值+远程对象激活
[0]README 1)本文文字描述转自 core java volume 2, 旨在学习 java分布式对象--远程方法中的参数和返回值+远程对象激活 的相关知识: [1]远程方法中的参数和返回值 ...
- 本地方法(JNI)——数值参数与返回值
[0]README 1) 本文部分文字描述 转自 core java volume 2 , 旨在理解 本地方法(JNI)--数值参数与返回值 的基础知识 : 2) for source code, p ...
- Lambda表达式有参数有返回值的练习(自定义接口)
package com.learn.demo06.Lambda;/*Lambda表达式有参数有返回值的练习需求:给定一个计算器Calculator接口,内含抽象方法calc可以将两个int数字相加得到 ...
- 【C++】函数 指针类型参数 与 引用类型参数 对比 ( 修改外部变量需要传入的参数要求 | 参数作返回值 )
文章目录 I . 博客总结 . 指针与引用类型参数 II . 指针作为参数和返回值 III . 引用参数简介 IV . 引用作为参数和返回值 I . 博客总结 . 指针与引用类型参数 1 . 讨论问题 ...
- java中类作为成员变量类型使用、接口作为成员变量类型使用、接口作为方法的参数或返回值使用
类作为成员变量类型使用: 自定义的类也可以作为成员变量使用,如: // 1.创建一个电脑角色的类: public class Computer{private String computername; ...
- const 修饰函数参数,返回值,函数体,保护数据
一.const 介绍 1.const 定义 const 修饰的数据类型是指常类型,常类型的变量或对象的值是不能被更新的. 2.const 目的 const 推出的初始目的,正是为了取代预编译指令,消除 ...
最新文章
- 导购网站 服务器,导购网站云服务器配置
- 烂大街的缓存穿透、缓存击穿和缓存雪崩,你真的懂了?
- 用.NET CF进行HardReset?
- c语言格式化字符漏洞,格式化字符串漏洞题目练习
- C# try catch finally 执行
- 剑指 offer 编程题 C++ 版总结(中)
- winform 统计大量数据重复的元素个数_DAY10——推断统计之概率与概率分布:常见的离散型概率分布...
- 华为云平台创建产品+注册设备
- Linux内核编译与安装[转]
- 单片机原理及应用实验报告
- 计算机组成原理中的DUBS是,[转帖]实验室名称中英文对照大整理
- 工业互联网,姓工,名互
- 《GPU编程与CG语言之阳春白雪下里巴人》 读书笔记2
- STM32 keil中__IO得意思
- 斯坦福大学的低码率音频编码博士论文
- web入门 命令执行 web29-web41
- GBase基本查询操作
- Jboss与jdk版本不兼容问题
- 一起设计一个Android倒计时组件
- idea ctrl+alt+向左箭头不能用
热门文章
- VirtualBox不能共享剪贴板,有两种情形
- C处理Python返回的字串代码
- java解析获得birt报表的数据_java pojo实体类做birt报表数据源
- tns无监听程序_成ORA-12560: TNS: 协议适配器错误的问题的原因
- wpf获取当前窗体的屏幕坐标
- 怎么下载linux历史文件,快速学习Linux-Linux历史
- ionic 网站放在服务器,Ionic4 服务器插件-服务器Httpd - Ionic Native
- python无法调用安装的包_无法在Windows 10上使用python2.7/MINGW安装pyslalib软件包
- GetCommandLine()和CommandLineToArgvW()
- GUID和UUID、CLSID、IID 区别及联系