交叉编译

  • 在一个平台下,编译出另一个平台能够执行的二进制的代码
  • 平台:windows,mac os,linux
  • 处理器:x86,arm,mips

交叉编译的原理

  • 源代码->编译->链接->可执行程序
  • 模拟其他平台的特性

交叉编译的工具链

  • 多个工具的集合,一个工具使用完后接着调用下一个工具

常见工具

  • NDK:native developement kit:开发jni必备,就是模拟其他平台特性来编译代码的工具
  • CDT:C/C++ developement tools:高亮显示c语言关键字
  • cygwin:一个模拟器,可以再windows下运行linux指令

NDK目录结构

  • docs:帮助文档
  • build/tools:linux的批处理文件
  • platforms:编译c代码需要使用的头文件和类库
  • prebuilt:预编译使用的二进制可执行文件
  • sample:jni的使用例子
  • source:ndk的源码
  • toolchains:工具链
  • ndk-build.cmd:编译打包c代码的一个指令

使用jni

  1. 在项目根目录下创建jni文件夹

  2. 在jni文件中创建一个c文件

  3. 在java代码中,创建一个本地方法helloFromC

     public native String helloFromC();
    
  4. 在jni中定义函数实现这个方法,函数名必须为

     jstring Java_com_itheima_helloworld1_MainActivity_helloFromC(JNIEnv* env, jobject obj)
    
  5. 返回一个字符串,用c定义一个字符串

     char* cstr = "hello from c";
    
  6. 把c的字符串转换成java的字符串

     jstring jstr = (*env)->NewStringUTF(env, cstr);return jstr;
    
  7. 在jni中创建Android.mk文件

  8. 在c文件中添加<jni.h>头文件

  9. 在jni文件夹下执行ndk-build.cmd指令

  10. java代码中加载so类库,调用本地方法

常见错误

  • findLibrary returned null

    • CPU平台不匹配
    • 加载类库时,写错类库名字
  • 本地方法找不到

    • 忘记加载类库
    • c代码中方法名写错了

javah

*1.7:在src目录下执行javah 包名.类名
*1.6:在bin/classes目录下执行

javap

  • 在bin/class目录下执行javap -s 包名.类名

    • 打印方法签名

C向C++改造

  1. 把c文件后缀名换成cpp
  2. Android.mk文件中的hello.c也要换成hello.cpp
  3. c++的使用的环境变量结构体中,访问了c使用的结构体的函数指针,函数名全部都是一样的,只是参数去掉了结构体指针
  4. 访问函数指针时,把env前面的*号去掉,因为此时env已经是一级指针
  5. clean,清除之前编译的残留文件
  6. 把声明函数的h文件放入jni文件夹中,include该h文件

Android入门笔记12相关推荐

  1. Android入门笔记之更改手机屏幕方向

    Android入门笔记之更改手机屏幕方向 <1>简介 通过一个按钮组来改变横屏竖屏显示. <2>关键步骤 主要通过android.app.activity.getRequest ...

  2. 【机器学习入门笔记12:matplotlib绘图模块的使用】20190217

    2019-02-17  by 崔斐然 我们先在anaconda中参考笔记1中的配置方法安装matlpotlib. plt.plot绘制折线图,其中参数1:x轴坐标,参数2:Y轴坐标,参数3:颜色 im ...

  3. Android入门(12)| 数据持久化

    文章目录 数据持久化 文件存储 将数据存储进文件 实例 从文件中读取数据 实例 SharedPreferences存储 将数据存储进文件 实例 从文件中读取数据 实例 实现记住密码的功能 SQLite ...

  4. 吴恩达机器学习入门笔记12/13-聚类与降维

    12 聚类-无监督学习算法之一 聚类试图将数据集中的无标记样本划分为若干个通常不相交的子集,每个子集称为一个簇(cluster),每个簇可能对应于一些潜在的概念 聚类算法的两个基本问题:性能度量和距离 ...

  5. Android复习笔记(12) -handler的使用

    handler主要实现现在之间的通信.在子线程中执行耗时操作,通过handler传递数据给主线程进行UI的更新. 用法: 1.在主线程中创建Handler子类对象, 重写handleMessage() ...

  6. 云炬Android开发笔记 12基于WebView的混合App框架设计(包含浏览器与原生请求Cookie的处理)

    阅读目录 1.WebView高可扩展性封装 1.1 发现模块的框架搭建 1.2 webView的基类 1.3 对webview基类的实现 1.4 setInitializer的方法的实现 1.5 we ...

  7. Android Studio 基础入门笔记

    Android Studio 基础入门笔记 Android Studio 基础入门笔记 为什么选择使用 Android Studio 而不是EclipseADT 安卓配置JDK AS如何更新 常规的 ...

  8. 理财入门笔记(1课-12课)

    理财入门笔记(1课-12课) 一.改变穷人思维 穷爸爸富爸爸作者罗伯特清崎,财务自由思想在90年代掀起了浪潮,真的是说出了穷富的秘密,大家务必认真看认知很重要:富人思维揭秘 学习理财的目的 1.聪明消 ...

  9. Android 插件化原理入门笔记

    Android开发笔记 onGithub 笔记,参考7.2中所列参考文章所写,DEMO地址在PluginTestDemoApplication 1.综述 2015年是Android插件化技术突飞猛进的 ...

  10. Android入门自学笔记

    Android入门 前几个月要去作物联网项目,花了一个月入门android本文写于物联网大赛后 Android入门所需书籍 <android第一行代码>-----入门必看书.这本书实例和理 ...

最新文章

  1. 2020-11-02C 标准库 - <ctype.h>
  2. 结构型模式之Composite模式
  3. [转载]Javascript异步编程的4种方法
  4. C语言,把指针按地上摩擦,爽
  5. spring中@Value的使用(读取配置文件信息)
  6. c语言程序设计实践教程编程题8.3,C语言程序设计教程(21世纪计算机科学与技术实践型教程)...
  7. 大型网络之---公司内部局域网
  8. java中整形_java中怎样实现60多位整形数字的运算
  9. Matlab重建信号实验总结,实验三信号采样与重建(实验报告).doc
  10. MySQL索引的原理,B+树、聚集索引和二级索引的结构分析
  11. mysql 循环_MySQL存储过程中的3种循环【转载】
  12. IDEA设置背景与字体大小
  13. 网页游戏开发语言AS3(ActiveScript3.0)
  14. 局域网共享问题解决方案----日常经验总结
  15. Pdf之C#直接打印pdf文件
  16. 宾州州立计算机科学世界排名,宾州州立大学帕克分校qs世界排名
  17. 11月第5周业务风控关注|重磅!瓜子二手车“遥遥领先”被罚天价1250万
  18. 自动化测试框架[Cypress命令行执行测试详解]
  19. 想出名 你就这样炒作自己
  20. 当你试图将【圣杯布局】无限套娃__

热门文章

  1. 搜索引擎设计实用教程(1)-以百度为例 之一:查询处理以及分词技术
  2. 12月10日 ubuntu 安装wireshark
  3. 清华大学发布OpenNE:用于网络嵌入的开源工具包
  4. Ubuntu 下使用apt-get安装最新版本的MySQL
  5. SharePoint 2013 添加Ribbon菜单
  6. TestNG官方文档中文版(1)-介绍
  7. 加密解密学习--基本概念拾掇
  8. c# 用BitArray来管理包含关系
  9. ASP.NET编程的十大技巧
  10. Linux diff diff3 diffstat