安卓中如何调用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 ...
随机推荐
- Java数组的使用
一.数组的动态初始化 1.声明数据类型[] 数组名;或数据类型 数组名[];2.开辟空间数组名 = new 数据类型[长度];//长度必不可少3.手动赋值数组名[下标] = 值;4.使用(打印.运算. ...
- 解决在data里面获取一个固定的img值
正常情况下在data里面申明,在img标签里面通过 :src应用就行了,但是如果是直接申明引用是没效果的: html: <div class="logo"> <i ...
- 创建Spring Boot微服务项目
创建一个测试用的微服务项目HelloWorld 创建项目 编写服务代码 @RestController public class HelloWorld { @RequestMapping(" ...
- POJ-2528 Mayor's posters (离散化, 线段树)
题目传送门: POJ-2528 题意就是在一个高度固定的墙面上贴高度相同宽度不同的海报,问贴到最后还能看到几张?本质上是线段树区间更新问题,但是要注意的是题中所给数据范围庞大,直接搞肯定会搞出问题,所 ...
- Runnable和Thread区别和比较
在很多博客中用这样一个例子来说明 Runnable更容易实现资源共享,能多个线程同时处理一个资源. 看代码: public static void main(String[] args) { new ...
- Elasticsearch7.X 入门学习第九课笔记-----聚合分析Aggregation
原文:Elasticsearch7.X 入门学习第九课笔记-----聚合分析Aggregation 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. ...
- webpack打包过程及开发过程
1.传统: 1)分模块去定义js.js中要导出将来要被打包的方法module.exports 2)定义main.js入口文件(主文件).在此文件中,导入引用的js文件 var {add} = requ ...
- ZYNQ系列
赛灵思公司(Xilinx)推出的行业第一个可扩展处理平台Zynq系列.旨在为视频监视.汽车驾驶员辅助以及工厂自动化等高端嵌入式应用提供所需的处理与计算性能水平. 中文名 ZYNQ系列 开发商 赛灵 ...
- 02cython调用c++文件
https://blog.csdn.net/ztf312/article/details/77340300 此时用python setup.py build_ext --inplace编译时报错如下: ...
- tac 反向显示文件内容
1.命令功能 tac是cat的反向拼写,功能是反向显示文件内容. 2.语法格式 tac option file 3.使用范例 [root@localhost chu]# cat test.txt ...