安卓中如何调用jni
* 数组名就是数组元素的首地址* 数组是一块连续的内存空间,每个元素之间的距离跟数据的类型有关* 数组名字取地址,得到的还是数组的首地址* arr[i] == *(arr+i)
* 动态内存- new 对象这就是动态申请内存* 静态内存- 方法体 int i; 静态内存
规范,中间人,中间件 c/c++ <---> javaNDK: native develop kits 谷歌给安卓程序员提供的一个做jni开发的工具
- doc 开发帮助文档- build c语言编译的工具链 cygwin- platform 平台: 指定了编译针对的Android平台- arm 处理器架构 手机平板电脑 三星 摩托- mips 处理器架构 开源的处理器架构(龙芯)- x86 处理器架构 台式机 笔记本(intel,AMD)>交叉编译: 使用交叉编译工具链在一个平台下编译出来另外一个平台可以运行的二进制代码>c词法分析 语法分析 编译原理- prebuild 预编译工具目录.java -->.class --->jvm -->解释执行(java翻译机器语言).c --> .o --->根据机器类型链接 -->机器代码- sample 示例代码- source 工具链的源码- tool chains 工具链- ndk-build.cmd 编译c代码的工具脚本
* JAVA程序员 搞Android开发* c程序员 搞c开发,实现业务功能(例如用c实现一个加密算法)* JNI工程师(胶水)- 定义java的接口- 定义c的接口
c/c++ develop tools,可以让c/c++的语法高亮显示。编译c代码。ndk交叉编译的工具链。
1. 现在java代码里面声明一个native的方法public native String helloFromC();2. 在Eclipse的工程目录下创建一个文件夹 名称jni3. 编写c代码,按照规范编写jstring Java_com_itheima_hellojni_MainActivity_helloFromC(JNIEnv* env,jobject obj){char* str = "hello from c !!";//在jni规范里面 在jni环境的结构体里面//jstring (*NewStringUTF)(JNIEnv*, const char*);//转化成了java的字符串return (*(*env)).NewStringUTF(env,str);}Java_包名_类型_方法名(jvm虚拟机的指针,调用者对象)4. ndk-build.cmd指令编译c代码5. 配置Android.mk文件#指定编译的文件夹 指定当前文件目录LOCAL_PATH := $(call my-dir)#编译器会定义很多的临时变量,中间变量,最好清空所有的中间变量。include $(CLEAR_VARS)#编译出来模块的名称LOCAL_MODULE := hello# 编译的源代码的名称LOCAL_SRC_FILES := hello.c#编译一个动态库,静态库#静态库 文件名.a 包含所有的函数并且函数运行的依赖,体积大,包含所有的API#动态库 文件名.so 包含函数,不包含函数运行的依赖,体积小,运行的时候,去操作系统寻找需要的APIinclude $(BUILD_SHARED_LIBRARY)6. 生成一个.so的动态链接库7. 在java代码里面,把动态链接库加载到jvm虚拟机static{System.loadLibrary("库文件名称不带前缀,后缀名");}8. 像调用一般java代码一样调用native的方法
银行手机客户端应用。钱。JAVA 非常容易反编译。* c代码已经写好了()* java代码和c代码同时开工
1. 写错了load的libraryjava.lang.UnsatisfiedLinkError: Couldn't load hell0: findLibrary returned null2. Android.mk文件编写错误/jni/Android.mk:4: *** missing separator. Stop.3. LOCAL_MODULE配置不能有扩展名//jni/Android.mk:hello.so: LOCAL_MODULE_FILENAME must not contain a file extension4. c或者c++的源文件名称配置错误objs/hello/helo.o'. Stop.5. 如果使用了错误的cpu平台java.lang.UnsatisfiedLinkError: Couldn't load hello: findLibrary returned null添加多cpu平台的支持 APP_ABI := armeabi armeabi-v7a x866. c语言方法名称错误,导致java代码无法寻找到c代码Caused by: java.lang.UnsatisfiedLinkError: Native method not found: com.itheima.hellojni.MainActivity.helloFromC:()Ljava/lang/String;7. 应用程序闪退06-25 07:31:46.698: I/dalvikvm(1871): #00 pc 0008ee6d /system/lib/libdvm.so06-25 07:31:46.698: I/dalvikvm(1871): #01 pc 000738ca /system/lib/libdvm.so06-25 07:31:46.698: I/dalvikvm(1871): #02 pc 000739f4 /system/lib/libdvm.so06-25 07:31:46.698: I/dalvikvm(1871): #03 pc 00038f5b /system/lib/libdvm.so06-25 07:31:46.698: I/dalvikvm(1871): #04 pc 0003bdbd /system/lib/libdvm.so要么就是c代码有逻辑错误要么编码问题,中文或者空格路径
安卓中如何调用jni的更多相关文章
- 关于 调用 JNI JAR 的说明和注意事项,调用第三方 JAR SDK 和 翻译 安卓 JAVA 代码 的说明 V2015.6.10
关于 调用 JNI JAR 的说明和注意事项,调用第三方 JAR SDK 和 翻译 安卓 JAVA 代码 的说明 V2015.6.10 转载请标明出处,否则死全家.选择[复制链接]即可得到出处. (* ...
- 图解-安卓中调用OpenGL
游戏开发中经常使用到OpenGL,当然很多人都喜欢直接用现有的游戏引擎,但相信了解的更多对你没有坏处 安卓开发中,采用的OpenGL ex2的规范,前几天看了下这个规范,整体上难度比1.0规范难度加大 ...
- Android(安卓)开发通过NDK调用JNI,使用opencv做本地c++代码开发配置方法 边缘检测 范例代码
以前写过两个Android开发配置文档,使用NDK进行JNI开发,这样能够利用以前已经写好的C++代码. 前两篇博客地址: http://blog.csdn.net/watkinsong/articl ...
- JNI中C调用Java方法
背景需求 我们需要在JNI的C代码调用Java代码.实现原理:使用JNI提供的反射借口来反射得到Java方法,进行调用. JNI关键方法讲解. 1. 在同一个类中,调用其他方法 JNIEXPORT v ...
- 【转】Eclipse中一键调用javah生成jni的头文件
这里定义了一个本地方法jni_test,该方法返回一个String.其中System.loadLibrary是用来加载本地库的(dll或者so). 有了这个类以后,就可以调用javac命令编译,得到E ...
- Android JNI中C调用Java方法
背景需求 我们需要在JNI的C代码调用Java代码.实现原理:使用JNI提供的反射借口来反射得到Java方法,进行调用. JNI关键方法讲解. 1. 在同一个类中,调用其他方法 JNIEXPORT v ...
- angularjs中安卓原生APP调用H5页面js函数,js写法应注意
安卓原生app调用js方法,js方法应写在html下的script标签内,不能有任何function包裹,例如angular的controller层,这样APP也是获取不到的: 所以只有放在html中 ...
- [转]Android通过NDK调用JNI,使用opencv做本地c++代码开发配置方法
原文地址:http://blog.csdn.net/watkinsong/article/details/9849973 有一种方式不需要自己配置所有的Sun JDK, Android SDK以及ND ...
- 安卓中的Model-View-Presenter模式介绍
转载自:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0425/2782.html 英文原文:Introduction to M ...
随机推荐
- [BZOJ 3731] Gty的超级妹子树 (树分块)
[BZOJ 3731] Gty的超级妹子树 (树分块) 题面 给出一棵树(或森林),每个点都有一个值.现在有四种操作 1.查询x子树里>y的值有多少个 2.把点x的值改成y 3.添加一个新节点, ...
- 13 个设计 REST API 的最佳实践
原文 RESTful API Design: 13 Best Practices to Make Your Users Happy 写在前面 之所以翻译这篇文章,是因为自从成为一名前端码农之后,调接口 ...
- 微信小程序的短信接口
使用聚合数据 (网址) https://www.juhe.cn/docs? 注册部分略! 这是登录部分的. 一: 二.我的接口
- Express 2015 RC for Windows 10 安装
支持的操作系统 Windows 10 Technical Preview 硬件要求 1.6 GHz 或更快的处理器 1 GB RAM(如果在虚拟机上运行,则为 1.5 GB) 4 GB 可用硬盘空间 ...
- How to Add Memory, vCPU, Hard Disk to Linux KVM Virtual Machine
ref: https://www.thegeekstuff.com/2015/02/add-memory-cpu-disk-to-kvm-vm/ In our previous article of ...
- php内置函数分析之strrev()
PHP_FUNCTION(strrev) { zend_string *str; char *e, *p; zend_string *n; if (zend_parse_parameters(ZEND ...
- 前端小姐姐学PHP之(一)
作为一个前端不懂后台那是不对的,嘻嘻,来走一波... 一.安装 **我这里用的是phpStudy和phpStrom** 1.安装phpStudy 链接:https://pan.baidu.com/s/ ...
- 每次当浏览到网页,点击tab标签又回到顶部去了!
通常tab的标签使用a链接,而a链接的href值为#,这是一个锚点的属性,因此他会跳转到网页的顶端.如果你的tab包含一个id=tab,也可以设置为href="#tab"这样他就会 ...
- 重置Jenkins的构建历史
1.重置单个JOB的构建历史item = Jenkins.instance.getItemByFullName("your-job-name-here") //THIS WILL ...
- java扫描仪上传文件
问题: 项目中有一个功能,原来是用ckfinder做的,可以选择本地图片上传至服务器,然后将服务器的图片显示在浏览器中,并可以将图片地址保存到数据库:现在客户觉得麻烦,提出连接扫描仪扫描后直接上传至服 ...