安卓中如何调用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 ...
随机推荐
- hdu-4185.loiol_skimming(简单二分匹配模型)
/************************************************************************* > File Name: hdu-4185. ...
- 解决在data里面获取一个固定的img值
正常情况下在data里面申明,在img标签里面通过 :src应用就行了,但是如果是直接申明引用是没效果的: html: <div class="logo"> <i ...
- dp(最大分段和)
http://acm.hdu.edu.cn/showproblem.php?pid=1024 Max Sum Plus Plus Time Limit: 2000/1000 MS (Java/Othe ...
- web框架Django一
一.django安装 # pip 安装 pip3 install Django # 克隆下载最新版本 git clone https://github.com/django/django.git # ...
- TP框架中的M、D、C、I、A、S方法
M方法 M实例化参数是数据库的表名 //使用M方法实例化$User = M('User');//和用法$User = new /Think/Model ('User');等效//执行其他的数据操作$U ...
- 正则表达式RegExp对象
3.1 正则表达式对象的创建方式 字面量的方式 var patt = /匹配规则/修饰符; / --> 边界的意思 new关键字 var patt = new RegExp( ...
- unity2017 光照与渲染(一)
光照&渲染(基于unity2017.2.0) Custom Skybox 天空盒 最丰富的环境光 a. TextureShape 改成 Cube. b. 把图片直接丢给天空,就会自动生成材质. ...
- centos下通过conda安装pytorch
一.安装anaconda anaconda安装简单,只要确定自己的系统即可,具体安装请参考这里 二.确定自己的系统版本 我的是centos cat /etc/redhat-release 查看linu ...
- express 获取post 请求参数
在 Express 中没有内置获取表单 POST 请求体的 API , 我们需要添加第三方插件库 安装: npm install --save body-parser 配置: var bodyPars ...
- 插头$DP$学习小结
插头\(DP\)学习小结 这种辣鸡毒瘤东西也能叫算法... 很优秀的一个算法. 最基本的适用范围主要是数据范围极小的网格图路径计数问题. 如果是像\(Noi2018\)那种的话建议考生在其他两道题难度 ...