首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在安卓系统上通过jni向C传递byte[]时出现问题

在安卓系统上通过jni向C传递byte[]时出现问题
EN

Stack Overflow用户
提问于 2011-08-13 08:44:55
回答 3查看 9.4K关注 0票数 8

我在Java语言中有一个byte[],它报告它的长度为256字节,我将其传递给C语言的本机函数。

当我试图从这个数组中获取数据时,它是完全错误的,当我打印出它时,它与我将其传递给C之前打印出的数据不匹配。

我尝试了几种访问数据的方法,包括GetByteArrayRegionGetByteArrayElements,但似乎都没有给出我想要的数据。

当我调查这个的时候,我试着看看JNI认为GetArrayLengthjbyteArray的长度是多少-它报告的长度是1079142960,远远超过我预期的256个字节。而且每次调用函数的值都是不同的,例如另一次GetArrayLength返回1079145720。

下面是我用来访问数组的代码:

代码语言:javascript
运行
AI代码解释
复制
JNIEXPORT jbyteArray function(JNIEnv* env, jbyteArray array) {
    int length = (*env)->GetArrayLength(env, array);

    jbyte data[256];

    (*env)->GetByteArrayRegion(env, array, 0, 256, data);
    //also tried
    //jbyte *data = (jbyte*) (*env)->GetByteArrayElements(env, array, NULL);
}

这看起来很简单,所以我不太确定到底是怎么回事。这个数组在Java中看起来很好,但它是用C生成的,并被传回,所以我认为可能出了什么问题,Java并不关心它,但当它返回到C时,它会破坏这个数组。

下面是我用来生成数组并将其传递回Java的代码:

代码语言:javascript
运行
AI代码解释
复制
//there is some openSSL stuff here that sets up a pointer to an RSA struct called keys that is size bytes large

jbyteArray result = (*env)->NewByteArray(env, size);

(*env)->SetByteArrayRegion(env, result, 0, size, (jbyte*)keys;

我是不是遗漏了什么?

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-08-13 11:52:34

此函数原型不正确:

代码语言:javascript
运行
AI代码解释
复制
JNIEXPORT jbyteArray function(JNIEnv* env, jbyteArray array)

第二个参数是jclassjobject。如果你的方法是静态的,它应该是:

代码语言:javascript
运行
AI代码解释
复制
JNIEXPORT jbyteArray function(JNIEnv* env, jclass cls, jbyteArray array)

如果它不是静态的:

代码语言:javascript
运行
AI代码解释
复制
JNIEXPORT jbyteArray function(JNIEnv* env, jobject obj, jbyteArray array)

您将类或对象视为数组,这解释了您获得的意外结果。

票数 12
EN

Stack Overflow用户

发布于 2011-08-13 11:28:55

我认为主要问题是强制将OpenSSL结构转换为字节数组。随着时间的推移,这个结构很可能会被释放。这就解释了当你返回到C语言时,报告给你的奇怪和不同的长度。给Java生成一个RSA*也不会对你有多大的帮助-- Java对这个特殊的结构一无所知,也无法识别它。

你应该尝试的是使用一个

  • i2d_PKCS8PrivateKey_bio(BIO *bp,EVP_PKEY *x,const EVP_CIPHER *enc,char *kstr,int klen,pem_password_cb *cb,EVP_PKEY *u)
  • int i2d_RSA_PUBKEY(RSA *a,unsigned char **pp)

这取决于您是只想将公钥信息传递给Java (see also here),还是同时将私有信息传递给Java。这样,您就可以确保从一开始就处理字节数组。

一旦这对您起作用了(使用您已经尝试过的技术),回到Java,您就可以将字节数组解析成有意义的东西。在公钥的情况下,这很简单:对数组使用X509EncodedKeySpec,并使用KeyFactory#generatePublic生成公钥。

在私钥的情况下,事情稍微复杂一些。OpenSSL只理解PKCS#8 format,而默认情况下,Java按照PKCS#1格式对其私钥进行编码。但是您已经可以使用i2d_PKCS8PrivateKey_bio将密钥转换为PKCS#8。不过,您需要首先将RSA*包装为EVP_PKEY*

代码语言:javascript
运行
AI代码解释
复制
EVP_pkey *pkey = EVP_PKEY_new();
EVP_PKEY_assign_RSA(pkey, rsa);

不要加密您的密钥并使用in-memory BIO,然后将生成的字节数组传递给Java,并在那里传递给PKCS8EncodedKeySpec的构造函数,最后使用KeyFactory生成您的私钥。

票数 1
EN

Stack Overflow用户

发布于 2011-08-13 09:09:38

请尝试在字符串后追加'\0‘字符。可能它不能识别字符串的结尾。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7049437

复制
相关文章
安卓7.0在线更新解析包时出现问题
关于7.0行为变更,FileProvider应用共享文件的问题可以看鸿洋大佬的这篇博客 https://blog.csdn.net/lmj623565791/article/details/72859156 但是我遇到的这个问题是明明有授权临时权限,FileProvider的XML也有写,但是在下载apk后解析安装包出错,后面回顾一圈代码发现,有问题。
萬物並作吾以觀復
2018/12/12
1.4K2
安卓JNI-OLLVM混淆
LLVM是编译器的框架系统,OLLVM(Obfuscator-LLVM):混淆JNI文件的一种工具
李玺
2021/11/22
8690
【Flutter】Flutter 混合开发 ( 安卓端向 Flutter 传递数据 | FlutterFragment 数据传递 | FlutterActivity 数据传递 )
在上一篇博客 【Flutter】Flutter 混合开发 ( 关联 Android 工程与 Flutter 工程 | 安卓页面中嵌入 Flutter 页面 | 安卓中启动 Flutter 页面 ) 中 , 创建 Android 工程 , 并将两个工程进行关联 , 在 Android 的 Activity 界面中嵌入了 FlutterFragment , 在 Android 中启动了 FlutterActivity ;
韩曙亮
2023/03/29
1K0
【Flutter】Flutter 混合开发 ( 安卓端向 Flutter 传递数据 | FlutterFragment 数据传递 | FlutterActivity 数据传递 )
浅谈安卓系统上的DSU loader
什么是DSU loader? dsu loader即 动态系统更新可以在使用动态分区的安卓设备上,不影响原来系统的同时安装一个副系统,用于体验最新的原生安卓系统(AOSP)(博主评:相比传统刷机模式,
Tianli
2023/03/03
13K0
iPhone 上也能用安卓系统了?!
今天看到一个视频,视频里一个人拿着一个 iPhone,但是里面运行的却是安卓系统,还是三星的 ROM。
崔庆才
2021/04/26
1.3K0
iPhone 上也能用安卓系统了?!
如何通过JNI传递对象执行回调
JNI的全称是java native interface,用来调用某些特定于系统平台或者硬件的操作,但是它只能调用c/c++的代码,若是其它语言代码,只能通过c/c++进行二次调用。
全栈程序员站长
2021/05/08
2.5K0
安卓开发之Activity传递参数
1、知识点:启动activity、注册activity、button绑定监听事件、传递参数、获取参数 2、传递参数以及绑定监听代码(注意如果绑定监听出现错误:需要导入import android.view.View.OnClickListener;) button2 = (Button) findViewById(R.id.button2); //button设置监听 button2.setOnClickListener(new OnClickListener(){ @Override public voi
苦咖啡
2018/05/08
6590
安卓代码段--传递Bundle数据
Intent intent=new Intent(MainActivity.this,TestAcitvity.class); Bundle bundle=new Bundle(); bundle.putString(“name”,”shaomiao”); bundle.putInt(“age”,17); /////// intent.putExtras(bundle); startActivity(intent);
tea9
2022/07/15
4590
安卓系统框架介绍(安卓常用框架)
——源码地址1: https://android.googlesource.com/
全栈程序员站长
2022/07/30
8.8K0
安卓系统框架介绍(安卓常用框架)
用 TensorFlow Lite 在安卓系统上实现即时人体姿态跟踪
作者 | Eileen Mao和Tanjin Prity,谷歌工程实习生,2019年夏季发布。
AiTechYun
2019/08/19
3.9K0
用 TensorFlow Lite 在安卓系统上实现即时人体姿态跟踪
实战-如何获取安卓iOS上的微信聊天记录、通过Metasploit控制安卓
在这篇文章中我们将讨论如何获取安卓、苹果设备中的微信聊天记录,并演示如何利用后门通过Metasploit对安卓设备进行控制。文章比较基础、可动手性强,有设备的童鞋不妨边阅读文章边操作,希望能激发大家对移动终端的安全兴趣。 “如何获取Android、iPhone手机上的微信聊天记录? ” 0×00 条件: 安卓设备已获取root权限,安装SSHDroid(通过ssh、ftp连接手机) Apple设备越狱,安装OpenSSH插件 0×01 安卓: 很多安卓手机的用户都会遇到这么一个尴尬的问题:手机用久了就不知
用户1631416
2018/04/12
5.1K0
实战-如何获取安卓iOS上的微信聊天记录、通过Metasploit控制安卓
安卓 jni 开发错误 UnsatisfiedLinkError: Native method not found
很明显是因为 native 方法找不到,google 下发现该错误出现频率还蛮高的,基本有两种:
Java架构师历程
2018/09/26
1.6K0
安卓上jni添加openGL后,编译报错undefined reference to glUniform1i
1.undefined reference to问题,根本原因是找不到函数实现,也就是找不到库。 2.导致找不到库的原因很多:
瑶瑶
2020/06/28
1.5K0
安卓实体类跳转activity传递
////////////////////user实体类 package com.example.shaomiao.testdemo;
tea9
2022/07/16
3370
office打开文件时出现向程序发送命令时出现问题_向文件发送命令时错误
大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说office打开文件时出现向程序发送命令时出现问题_向文件发送命令时错误,希望能够帮助大家进步!!!
Java架构师必看
2022/10/24
8.1K0
安卓逆向之自动化JNI静态分析
国庆几天在家写了个用于辅助 JNI 接口逆向分析的工具,同时支持 Ghidra、IDA 以及 Radare2。本文即是对这个工具的简单介绍,以及一些编写插件的体验记录。
evilpan
2023/02/12
1.1K0
安卓逆向之自动化JNI静态分析
在安卓手机或Win电脑上同步iOS上的日历
说说我的需求:我平时都是我的iPad上添加我日常的日程,但是如果要到电脑或安卓手机上也有同样的日历就比较不方便。
可定
2020/04/21
4.3K0
在安卓手机或Win电脑上同步iOS上的日历
appinventor安卓壁纸设置(上)
初步功能需求 打开安卓app,然后会看到一张内置好的图片,点击下方的设置壁纸,实现让这个图片成为壁纸的功能,实现方法调用安卓系统内置的壁纸设置工具。
泽泽社长
2023/04/17
9000
appinventor安卓壁纸设置(上)
Android--SVG在安卓系统中的应用
通过使用它的Path标签,几乎可以实现SVG中的其它所有标签,虽然可能会复杂一点,但这些东西都是可以通过工具来完成的,所以,不用担心写起来会很复杂。
aruba
2020/07/03
2.9K0
vue 通过 prop 向子组件传递数据
运行上面的代码,我们发现,组件 my-component 并不能获取实例中 data 的数据,这是因为组件与组件之间都拥有各自独立的作用域
章鱼喵
2019/10/16
1.2K0

相似问题

在安卓系统中向ImageView显示byte[]

511

Android & JNI如何向JNI传递Byte[]数据数组并取回Byte []

12

在安卓系统上将byte[]放入JSON

21

安卓系统中的FFMpeg jni?

10

在安卓系统中通过PutExtra传递图片

60
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文