JNI实战一:向Native层传递一个类,并从Native层返回一个类

android jni 返回java类 今天,简单讲讲android 在jni中如何返回一个java的类。 之前,我写了一些关于jni的博客,里面返回的都是简单的int类型,那么如果我需要返回很多int和String类型,那么怎么办呢?当然是在java里写一个类,把需要返回的变量封装成类之间返回。我在网上搜索了资料,终于解决了这个问题。这里记录一下。 在Native层返回一个复杂对象(即一个类咯) 使用的类非常简单,如下: 阅读详情

环境:MyEclipse或者eclipse

    visual studio 2013

描述:向Native层传递一个类,并从Native层返回一个类。这个类的全限定名称是com.example2.Test。

     Test类共有两个属性,分别是一个数组px,和一个字符串upper。通过调用mydll2.dll实现数组px中元素的从小到大排序,以及字符串upper中的字母全部变大写字母。

Test类:

package com.example2;

public class Test {

private int[]px;

private String upper;

public Test(){

}

public Test(int[] px,String upper) {

this.px = px;

this.upper = upper;

}

public int[] getPx() {

return px;

}

public void setPx(int[] px) {

this.px = px;

}

public String getUpper() {

return upper;

}

public void setUpper(String upper) {

this.upper = upper;

}

}

PxUper类:

package com.example2;

public class PxUper {

public native Test objectMethodTest(Test test);

public static void main(String[] args){

System.loadLibrary("com_example2_PxUper");

PxUper pxUper = new PxUper();

Test test = new Test();

test.setPx(new int[]{10,4,9,6,2,20,7,6,2,20,7});

test.setUpper("zhsafwetggdsgdffssdgsd");

Test test1 = pxUper.objectMethodTest(test);

System.out.println(test.getUpper());

System.out.println(test1.getUpper());

for(int i=0; i<test.getPx().length; i++){

System.out.print(test.getPx()[i] +"、");

}

System.out.println();

for(int i=0; i<test1.getPx().length; i++){

System.out.print(test1.getPx()[i] +"、");

}

}

}

 

com_example2_PxUper.dll的h文件:

#include <jni.h>

#ifndef _Included_com_example2_PxUper

#define _Included_com_example2_PxUper

#ifdef __cplusplus

extern "C" {

#endif

JNIEXPORT jobject JNICALL Java_com_example2_PxUper_objectMethodTest

(JNIEnv *, jobject, jobject);

 

#ifdef __cplusplus

}

#endif

#endif

 

com_example2_PxUper.dll的cpp文件:

// com_example2_PxUper.cpp : 定义 DLL 应用程序的导出函数。

#include "stdafx.h"

#include "com_example2_PxUper.h"

#include <jni.h>

#include <stdio.h>

#include <Windows.h>

#include <iostream>

using namespace std;

 

typedef int* (*fPx)(int*,int);

typedef char* (*fUp)(char*);

 

JNIEXPORT jobject JNICALL Java_com_example2_PxUper_objectMethodTest

(JNIEnv *env,jobject obj,jobject obj1){

HMODULE hModule = LoadLibrary(L"mydll2.dll");

if (!hModule){

cout << "Error!" << endl;

}

else{

cout << "Success!" << endl;

}

jclass ob = env->GetObjectClass(obj1);

jfieldID pxFieldID = env->GetFieldID(ob,"px","[I");

jfieldID upperFieldID = env->GetFieldID(ob,"upper","Ljava/lang/String;");

 

jintArray px = (jintArray)env->GetObjectField(obj1, pxFieldID);

jsize px_len = env->GetArrayLength(px);

 

jint *p = new jint[px_len];

int *p1 = new int[px_len];

env->GetIntArrayRegion(px, 0, px_len, p);

for (int i = 0; i < px_len; i++)

{

p1[i] = p[i];

}

fPx ppx = (fPx)GetProcAddress(hModule,"Px");

int *ppx1 = ppx(p1, px_len);

jint *ppx2 = new jint[px_len];

for (int i = 0; i < px_len; i++)

{

ppx2[i] = ppx1[i];

}

jintArray pxx = env->NewIntArray(px_len);

env->SetIntArrayRegion(pxx, 0, px_len, ppx2);

 

jstring upper = (jstring)env->GetObjectField(obj1, upperFieldID);

const char * upp =env->GetStringUTFChars(upper,NULL);

char u[128];

strcpy(u,upp);

env->ReleaseStringUTFChars(upper,upp);

fUp uup = (fUp)GetProcAddress(hModule,"Up");

const char * uppp = uup(u);

jstring upper11;

upper11 = env->NewStringUTF(uppp);

 

 

jclass objClass = env->FindClass("Lcom/example2/Test;");

jmethodID constrocMID = env->GetMethodID(objClass, "<init>","([ILjava/lang/String;)V");

jobject reobj = env->NewObject(objClass, constrocMID, pxx, upper11);

return reobj;

}

 

 

mydll2.dll的h文件:

#ifdef MYDLL2_EXPORTS

#define MYDLL2_API __declspec(dllexport)

#else

#define MYDLL2_API __declspec(dllimport)

#endif

 

extern "C" MYDLL2_API int* Px(int*,int);

extern "C" MYDLL2_API char* Up(char*);

 

 

 

mydll2.dll的cpp文件:

// mydll2.cpp : 定义 DLL 应用程序的导出函数。

#include "stdafx.h"

#include <iostream>

#include "mydll2.h"

extern "C" MYDLL2_API int* Px(int *result,int size){

static int *r =new int[size];

int i, j, temp;

for (i = 0; i < size; i++)

{

r[i] = result[i];

}

for (i = 0; i < size; i++)

{

for (j = i + 1; j < size; j++)

{

if (r[i]>r[j])

{

temp = r[i];

r[i] = r[j];

r[j] = temp;

}

}

}

return r;

}

extern "C" MYDLL2_API char* Up(char *result){

char cap[128];

strcpy(cap, result);

int i = 0;

for (i = 0; i < strlen(cap); i++){

cap[i] = toupper(cap[i]);

}

char*   c = (char*)calloc(128,sizeof(char*));

strcpy(c, cap);

return c;

}

 

 

代码下载地址:http://download.youkuaiyun.com/detail/bide_tootight/9862707

详情参照:许你一城个人博客

android framework层怎么调用jni层接口 在Android Framework层调用JNI层接口的流程如下:在Java类中声明Native方法。生成JNI头文件。在C/C++中实现Native方法。编译Native代码为共享库。在Java代码中加载Native库。调用Native方法。通过JNI,Android Framework层可以与底层系统(如Linux内核)进行交互,实现高性能的功能开发。 阅读详情

相关推荐

Android Native层逆向实战:ARM汇编与JNI调用深度解析

在移动应用开发与安全领域,理解底层执行机制是深入性能优化与安全分析的关键。程序在运行时,其核心逻辑常通过本地代码(Native Code)实现,直接与操作系统和硬件交互,这涉及到特定的指令集架构。以广泛使用的ARM架构为例,其指令集定义了处理器执行运算、内存访问和控制流跳转的基本规则,是理解程序底层行为的基石。掌握ARM汇编语言,便能洞察寄存器操作、内存布局和函数调用约定,从而分析程序的真实执行流程。在Android平台上,Java代码与本地C/C++代码通过JNI(Java Native Interfac

aome1470的博客 482

NDK学习(一),向Native层传递各种参数、由Native层返回各种参数

本章涉及的技术要点: a、传递空参数,基本类型参数、多个参数,Java自定义类对象、不同类型的数组做参数 b、返回基本类型参数,返回Java自定义类对象,返回空 c、在JNI(C语言)环境中如何调用Java中的方法(得到方法ID,执行方法,得到返回值) d、在JNI(C语言)环境如何获取某个JAVA自定义对象的成员变量(得到Field ID,获取值) 参考文档:https:/

mxw3755的专栏 3778

一、Bluetooth Native层与协议栈的接口及其初始化过程

首先看一下Native层与协议栈的架构图: Bluetooth模块的Native代码位于packages/apps/Bluetooth/jni文件夹下,编译时生成libbluetooth_jni.so动态库文件,最终在image中的位置是/system/lib/libbluetooth_jni.so。 1 Bluetooth Native层与协议栈的接口及其初始化过程 1.1 B

qzh的专栏 2897

[JNI]开发之旅(8)传递参数给JNI函数

本节将介绍在JNI编程中如何传递参数和返回值。首先要强调的是,native方法不但可以传递Java的基本类型做参数,还可以传递更复杂的类型,比如String,数组,甚至自定义的类。jni.h中定义了很多接口供我们操作。其实在前面章节的例子中,我们已经使用到很多java传递参数给jni的例子,只是没有重点介绍,接下来会对传递几种基本类型参数,string,数组,java自定义对象这些参数介绍。1. 基

猫的阁楼 3914

从建模到调参:基于Simulink的两轮差速机器人轨迹跟踪PID控制全流程解析

本文详细解析了基于Simulink的两轮差速机器人轨迹跟踪PID控制全流程,涵盖运动学建模、仿真环境搭建、PID控制器设计与实现等关键环节。通过Simulink仿真和可视化调试技巧,帮助开发者掌握移动机器人运动控制的核心技术,提升轨迹跟踪精度与性能优化能力。

weixin_28717683的博客 244

滑块逆向及流程分析

本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!

pyzzd的博客 8009

android JNI编程技巧(ZZ)

本篇将介绍在JNI编程中如何传递参数和返回值。 首先要强调的是,native方法不但可以传递Java的基本类型做参数,还可以传递更复杂的类型,比如String,数组,甚至自定义的类。这一切都可以在jni.h中找到答案。 1. Java基本类型的传递 用过Java的人都知道,Java中的基本类型包括boolean,byte,char,short,int,long,float,double 这样...

java-admin 467

【51单片机仿真】基于51单片机设计的多功能电子时钟日历(实时时钟闹钟秒表温度检测)系统__资料编号5

该项目是基于单片机的多功能电子时钟系统,集成了时间显示、闹钟设置、秒表功能以及温度显示等功能。主要硬件包括1602液晶显示屏、DS1302时钟芯片、DS18B20温度传感器和蜂鸣器。系统通过按键进行时间和闹钟的设置,并实时显示当前时间和温度。

嵌入式阿齐Archie 2万+

JNI:实现流程/数据类型映射关系/参数传递/返回值

步骤 1. java层静态代码块:public static native String fun(String str); 2. 生成包名.类名.h头文件:javah -classpath bin/class; android.jar -d jni 包名.类名 -classpath:把java代码编译成的.class的目录 -d:输出目录 3. 创建.cpp文件:复制头文件中的函数名再实现函数 4. mk文件:编译脚本 LOCAL_MODULE := xxx // so名字 LOCAL_SRC_FI

onj123的博客 394

Python爬虫实战:如何爬取12306列车信息

本文介绍了如何使用Python编写爬虫,抓取12306列车信息。我们讲解了如何分析12306的列车数据接口,如何发送HTTP请求,解析返回的JSON数据,并将数据保存到本地文件中。我们还讨论了如何绕过反爬虫机制,如使用随机User-Agent和设置请求延时。通过这个实战项目,你应该掌握了如何爬取并解析来自公共API的数据,同时提高了你的爬虫技能。这些技能不仅适用于12306列车信息抓取,也可以广泛应用于其他需要抓取JSON数据的网站。

2201_76125261的博客 1923

C++笔记之emplace_back(),push_back()性能比较i++ 、 ++i

操作是否需要临时对象/拷贝性能需要(构造临时对象)较慢不需要(直接构造)较快i++需要(保存旧值)对于内置类型无影响,但对于自定义类型(如迭代器、大对象)会有拷贝开销++i不需要相对更快(尤其是自定义类型)都存在"是否需要额外的临时对象/拷贝"这一性能差异点和++i都是更高效的版本(避免临时对象/拷贝)和i++都可能产生额外的临时对象(前者构造临时对象,后者保存旧值)对于内置类型(如int),i++和++i性能几乎没有差异(编译器会优化);但对于自定义类型(尤其是迭代器等重量级对象),

小勇博客 98

JNI(三)、java代码传递int、String、int[] 并 调用C 代码

熟悉开发JNI基本流程以后,我来尝试写一下传递多种数据类型的情况。包括int、String、int[ ] 类型。这次我把这些native方法放在一个类中。 定义本地接口方法: package com.example.manzuo.jni; public class JNIUtils { static { System.loadLibrary("Message"); } pub

niu0147的专栏 6717

Codex 自定义模型操作指南:CLI 与桌面客户端双端实操

检查版本 codex --version # 预期输出类似:codex-cli 0.133.0-alpha.1 # 如未安装 npm install -g @openai/codex假设你要接入DeepSeek,在# 临时设置(当前终端会话有效)export DEEPSEEK_API_KEY="sk-你的 DeepSeek API Key"# 永久设置(推荐,写入 shell 配置)

篮球界最会写bug的人;程序猿中打球最菜的人。 454

JNI内形参从C代码中获取返回值并返回到Java层使用

工程的流程是基于C/C++语言进行底层的算法开发,再通过JNI获取结果,并拿到Java层运用。那么这里就要涉及到三层数据或值得传递了。作为中间层JNI如何将底层结果传出来呢? 当return已经被其他需要返回值占用了,此时又需要再增加一个返回值用于java层的使用判断。在不改变已有的接口形式的前提下,如何增加一个形参然后通过形参将值传递到Java层呢。

nanke_yh的博客 1568

【SpringBoot 3.x 第56节】再见 Feign?原生 HTTP 接口强势上位,这才是微服务调用的正确姿势!

🏆本文收录于《滚雪球学SpringBoot 3》,专门攻坚指数提升,本年度国内最系统+最专业+最详细(永久更新)。    本专栏致力打造最硬核 SpringBoot3 从零基础到进阶系列学习内容,🚀均为全网独家首发,打造精品专栏,专栏持续更新中…欢迎大家订阅持续学习。 如果想快速定位学习,可以看这篇【SpringBoot3教程导航帖】,你想学习的都被收集在内,快速投入学习!!两不误。    若还想学习更多,可直接前往《滚雪球学SpringBoot(全版本合集)》,涵盖SpringBoot所有版本教学文章

**My Coding Family** 1017

知识图谱开发实战:搭建上市公司知识图谱(二)

搭建上市公司知识图谱(二)学习目标1. 获取上市公司公开数据1.1 获取上市公司列表与行业信息1.2 代码展示2. 从网站爬取上市公司网页并存储为 HTML文件2.1 准备环境2.2 爬取上市公司公开信息3. 解析HTML文件,获取高管信息并存储为 csv 文件4. 设计知识图谱数据库4.1 实体4.2 关系4.3 属性4.4 特殊4.5 代码5. 知识图谱数据库查询实战5.1 实战:按照neo4j的数据格式,转换CSV文件5.2 实战:使用neo4j-admin 导入数据5.3 实战:使用neo4j-b

全网粉丝30W+,优快云、稀土掘金人工智能领域签约作者,人工智能、大模型、Python 爬虫,商务合作,请私信沟通。 2095

安卓JNI之纯native线程中的native方法调用Java层

摘要: 在JNI开发中,纯native线程调用Java层方法的核心问题在于获取JNIEnv环境。正常JNI调用通过Java层触发时会自带JNIEnv,而纯native线程需手动获取。解决步骤: 获取JavaVM:通过AndroidRuntime::getJavaVM(); 绑定线程获取JNIEnv:调用AttachCurrentThread(&env, &args),其中args可定制线程属性; 使用JNIEnv:调用Java方法(如CallStaticVoidMethod); 解绑线程:完

似霰的博客 1083

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Native层逆向:ARM汇编与JNI调用分析

ARM64寄存器用途速查表:数据操作指令: 控制流指令: 2. JNI调用机制深度解析 2.1 JNI接口架构 Java与Native交互流程: 2.2 动态注册逆向技巧 动态注册代码特征: 逆向定位策略:搜索交叉引用分析初始化函数追踪方法签名与实现地址映射函数识别技巧:使用F5伪代码生成快速定位关键逻辑重命名关键函数(快捷键)提升可读性创建结构体还原复杂数据类型: 3.2 Ghidra脚本开发 自动化字符串解密脚本: 4. Native层Hook技术 4.1 Frid

好看资源网的博客 1899

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

jni java返回数组_Android开发实践:Java层与Jni层的数组传递

Android开发中,经常会在Java代码与Jni层之间传递数组(byte[]),一个典型的应用是Java层把需要发送给客户端的数据流传递到Jni层,由Jni层的Socket代码发送出去,当然,Jni层也需要把从Socket接收到的数据流返回给Java层。我简单地总结了一下,从Java层到Jni层,从Jni层到JAVA层,各有3种传递方式,下面用代码示例简单地介绍一下。示例代码的主要文件有两个,一...

weixin_39779528的博客 789

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

JNI编程中如何传递参数和返回值。

引自:https://blog.youkuaiyun.com/henry121212/article/details/7482527 本篇将介绍在JNI编程中如何传递参数和返回值。 首先要强调的是,native方法不但可以传递Java的基本类型做参数,还可以传递更复杂的类型,比如String,数组,甚至自定义的类。这一切都可以在jni.h中找到答案。 1. Java基本类型的传递 用过Java的人都知...

mfkjq的专栏 1648

JNI实现回调| JNI调用JAVA函数|参数和返回值的格式

代码下载:http://dl.dbank.com/c0c0xs3b24 一、JNI实现回调 通过JNI在Native层调用JAVA层的方法,来实现Native层向JAVA层传递消息。 JNICallback.java public class JNICallb

stefzeus的专栏 2万+

JNI编程之如何传递参数(一)——String参数的传递

String参数的传递 Java的String和C++的string是不能对等起来的,所以处理起来比较麻烦。先看一个例子, class Prompt { // native method that prints a prompt and reads a line private native String getLine(String prompt); public stat

wangkr的专栏 5万+

Java代码与Jni层之间传递数组(byte[])

转载:http://www.linuxidc.com/Linux/2014-03/97561.htm Android开发中,经常会在Java代码与Jni层之间传递数组(byte[]),一个典型的应用是Java层把需要发送给客户端的数据流传递到Jni层,由Jni层的Socket代码发送出去,当然,Jni层也需要把从Socket接收到的数据流返回给Java层。我简单地总结了一下,从Java层到Jni层,从Jni层到JAVA层,各有3种传递方式,下面用代码示例简单地介绍一下。 示例代码的主要文件有两个,一个是

爱自在的专栏 2089

JNI学习积累之三 ---- 操作JNI函数以及复杂对象传递

本文原创,转载请注明出处:http://blog.youkuaiyun.com/qinjuning          在掌握了JNI函数的使用和相关类型的映射后,以及知晓何利用javah工具生成对应的jni函数以及如何生成动态     链接库 (windos下就是.dll库,Linux就是.so库了,不懂在Window下生成dll动态库的,具体流程可看我的这篇博客:    《

qinjuning、lets go 6万+

Android NDK开发——操作JNI函数以及复杂对象的传递

&amp;amp;amp;amp;nbsp; &amp;amp;amp;amp;nbsp; &amp;amp;amp;amp;nbsp; &amp;amp;amp;amp;nbsp; &amp;amp;amp;amp;nbsp; &amp;amp;amp;amp;nbsp; 原文链接:http://blog.youkuaiyun.com/qinjuning &amp;amp;amp;amp;nbsp;

liuderong0的博客 858

jni 从c传递map到java_JNI如何传递一个HashMap对象从java到C

JNI提供了很多API用来传递对象从JAVA到C, 一般比较普通的就是传递原始类型,或者String,如果传递的对象中包含其他类型的对象,过程就有点复杂了。先上代码吧.public class Container {private String hello;private Map parameterMap = new HashMap();public Map getParameterMap() {...

weixin_28716769的博客 873
上一篇: CSS绘制三角形(含代码)
下一篇: 小游戏——飞机大战
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值