Android For JNI(一)——JNI的概念以及C语言开发工具dev-c++,编写你的第一个C语言程序,使用C启动JAVA程序
Android For JNI(一)——JNI的概念以及C语言开发工具dev-c++,编写你的第一个C语言程序
当你的Android之旅一步步的深入的时候,你其实会发现,很多东西都必须去和framework或者底层打交道,还有就是混合编程之类的,以及新语言,新特性,各种牛人研究的黑科技,应接不暇,技术更新迭代太快了,我们要赶紧加快步伐了,今天就开始来入坑了——JNI,这个坑是必须要进的,啥也不说了,老司机,带我!
一.什么是JNI?
Java Native Interface(java本地接口)
说白了,JNI相当于一个协议,通过这个协议沟通java代码和外部的本地代码(C/C++),通过这个协议,这两门语言就可以相互调用了
二.为什么用JNI?
这个和我本身要学这个JNI的目的是一样的,我现在就在做车载方面的
- 1.物联网,智能家居,车载电脑
- 2.效率上C/C++语言效率更高
- 3.代码移植,复用已经存在的C代码
- 4.java反编译比C语言容易
三.怎么用JNI
- 1.JAVA语言
- 2.C/C++语言
- 3.JAVA JNI流程
- 4.NDK(Native Development Kits)
我们从C/C++语言开始学起,慢慢来完善JNI
四.配置C语言环境
新知识,涨姿势嘛,总是要学的,各位看官老爷倾听我慢慢道来,要用JNI调用C的话,其实还有一个痛点,就是你必须会这门语言才吃到怎么去用他的方法,所以我们必须花上几天的时间把C的基本概念和知识点给学会,其实编程思想有点类似,JAVA和C有一些基本的东西还是类似的,主要是C的指针还是有点抽象,跟以前学面向对象一样一样的,哈哈,污污污污….工欲善其事必先利其器,我们先把学C所用到的开发环境给部署一下
开发工具:dev-c++
下载地址:http://download.csdn.net/detail/qq_26787115/9490306
这个工具也只是让我们更加的熟悉语法,随便搜索一下就能下,属于一个轻量级的开发工具,我们下载下来安装
安装完成之后我们就可以运行了
五.Hello World
当我们一切都准备好了的时候,我们就可以来编写程序了,也就是注明的“Hello World”,现在看到helloworld是不是有一种很怀念的感觉
我们点击左上角的文件-新建-源代码,写上这么一段代码(先不要管什么意思,照着敲就行)
#include <stdio.h>
#include <stdlib.h> //和JAVA需要的包类似 导包
//main函数
main(){
//输出语句
printf("Hello World");
}
然后我们把他保存为C文件
我们要运行就得编译,用惯了Eclipse,Eclipse有自动编译的选项,而dev-c++是没有的,我们手动编译一下
我们可以看到上面有条工具栏,第一个就是编译了,第二个就是运行
出现Done说明编译完成,我们可以运行了,不过编译会一闪而过,因为是命令窗,具体的停留的我忘记了,和提前java有点类似
这里只要注意一点的是main。在C中,main函数也是程序的入口吗,C中的函数和java的方法是一个概念,只是叫法不一样
六.C语言启动JAVA程序
C是可以直接调用windows指令的,既然如此,我们可以仿照我们程序的快捷方式的例子去做一个软启动方式,说起来有点迷糊哈,我们举个例子,我们来到Eclipse的安装目录,你可以看到这样的一个目录
其中,我们的快捷方式只有只有314k,却能启动这个程序,这就是windows的特长了,而我们的C是可以直接使用windows的指令的,所以我们就可以间接的使用C去调用JAVA了
回到正题,我们刚才举的例子,其实从快捷方式的配置文件eclipse.ini中就可以详细的看到
我们把他打开
-startup
plugins/org.eclipse.equinox.launcher_1.3.0.v20140415-2008.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1.1.200.v20150204-1316
-product
org.eclipse.epp.package.java.product
--launcher.defaultAction
openFile
--launcher.XXMaxPermSize
256M
-showsplash
org.eclipse.platform
--launcher.XXMaxPermSize
256m
--launcher.defaultAction
openFile
--launcher.appendVmargs
-vmargs
-Dosgi.requiredJavaVersion=1.6
-Xms40m
-Xmx512m
我们不难发现,当我们启动的时候,他会执行plugins目录下的org.eclipse.equinox.launcher_1.3.0.v20140415-2008.jar架包,你双击他你会惊奇的发现,你竟然启动了eclipse,这就是windows启动的原理了,好了,既然逻辑通了,那我们就来写C代码吧!不过事先我们得准备一个java文件,我就把他放在C源码目录下好了
public class HelloWorld{
public static void main(String[] str){
//输出语句
System.out.println("HelloWorld");
}
}
你可别忘了这个是要编译的….
好了,写吧
#include <stdio.h>
#include <stdlib.h> //和JAVA需要的包类似
//main函数
main(){
//输出语句
system("java HelloWorld");
system("pause");
}
这里,只要写一句
system("java HelloWorld");
因为是同一个目录下,所以不需要写路径,我们运行就可以直接看到打印的HelloWorld了
好了,初步的认识先OK到这里,我们要使用C的话,只要一点点入门就够了,当然你有兴趣深入也是可以的,我们学C和学JAVA一样,下一篇主要还是以数据类型,指针,函数的认识为主,对了,还要提及一下他对内存的操控,这篇先到这里!
Android For JNI(一)——JNI的概念以及C语言开发工具dev-c++,编写你的第一个C语言程序,使用C启动JAVA程序的更多相关文章
- 【Android】12.1 Intent基本概念
分类:C#.Android.VS2015: 创建日期:2016-02-23 一.简介 Intent:意图,含义就是你想利用它调用哪个组件实现相关的功能,比如调用相机组件实现拍照.调用Contact组件 ...
- 一起学android之怎样获取手机程序列表以及程序相关信息并启动指定程序 (26)
效果图: 程序列表: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGFpX3FpbmdfeHVfa29uZw==/font/5a6L5L2T/fonts ...
- java基础 三 概念和java程序的结构.
一.java的一些概念: JRE(java runtime environment):java程序运行环境,如果要运行java程序,需要jre支持.jre里包含jvm JDK(java devel ...
- 003 01 Android 零基础入门 01 Java基础语法 01 Java初识 03 Java程序的执行流程
003 01 Android 零基础入门 01 Java基础语法 01 Java初识 03 Java程序的执行流程 Java程序长啥样? 首先编写一个Java程序 记事本编写程序 打开记事本 1.wi ...
- Android(java)学习笔记256:JNI之NDK的概念
1.交叉编译 (1)概念 在一个平台(硬件)和os(软件)环境下,编译出另一种平台和os下可以运行的二进制代码. e.g: 电脑端 ...
- Android(java)学习笔记255:JNI之JNI概念
1. JNI是什么? java native interface (java本机接口) 比如方法声明: public final native Class<?> getClass(): ...
- Android(java)学习笔记200:JNI之NDK的概念
1.交叉编译 (1)概念 在一个平台(硬件)和os(软件)环境下,编译出另一种平台和os下可以运行的二进制代码. e.g: 电脑端 ...
- Android(java)学习笔记199:JNI之JNI概念
1. JNI是什么? java native interface (java本机接口) 比如方法声明: public final native Class<?> getClass(): ...
- Android JNI编程(一)——JNI概念以及C语言Dev-C++开发环境搭建、编写HelloWorld
版权声明:本文出自阿钟的博客,转载请注明出处:http://blog.csdn.net/a_zhon/. 目录(?)[+] 一:JNI是什么呢? JNI:JNI是JavaNative Interfac ...
随机推荐
- android M Launcher之LauncherModel (二)
上一篇我们通过LauncherModel的创建 ,实例化,以及与LauncherModel之间的沟通方式.初步了解了LauncherModel一些功能及用法,如果对LauncherModel一系列初始 ...
- J2EE进阶(十七)Hibernate中常用的HQL查询方法(getHibernateTemplate())
J2EE进阶(十七)Hibernate中常用的HQL查询方法(getHibernateTemplate()) 当我们使用Hibernate进行数据的CRUD操作时,利用模版进行操作不失为一种方法. ...
- 如何编写入门级redis客户端
概述 Redis是开源的.基于内存的数据结构存储系统,可用作数据库.缓存以及消息代理方面.Redis支持许多种数据结构,并内置了丰富的诸如冗余.脚本.事务.持久化等功能,深受业界喜爱,被各种业务系统广 ...
- tomcat启动批处理——setclasspath.bat
除了上面两个批处理,还有一个比较重要的脚本,即是setclasspath.bat,它主要负责寻找.检查JAVA_HOME和JRE_HOME两个变量. ************************* ...
- 20 ViewPager demo5,6:FragmentAdapter 导航数据
Demo5 文件结构: MainActivity.java package com.qf.day20_viewpager_demo5; import java.util.ArrayList; impo ...
- Oracle 执行计划(Explain Plan) 说明
如果要分析某条SQL的性能问题,通常我们要先看SQL的执行计划,看看SQL的每一步执行是否存在问题. 如果一条SQL平时执行的好好的,却有一天突然性能很差,如果排除了系统资源和阻塞的原因,那么基本可以 ...
- Linux下yum安装MySQL yum安装MySQL指定版本
yum安装MySQL 1. 查看有没有安装过 yum list installed MySQL* (有存在要卸载yum remove MySQL*) rpm -qa | grep my ...
- shell-----sed命令详解
Table of Contents 1. Sed简介 2. 定址 3. Sed命令 4. 选项 5. 元字符集 6. 实例 7. 脚本 1. Sed简介 sed是一种在线编辑器,它一次处理 ...
- 网站开发进阶(四十二)巧用clear:both
网站开发进阶(四十二)巧用clear:both 前言 我们在制作网页中用div+css或者称xhtml+css都会遇到一些很诡异的情况,明明布局正确,但是整个画面却混乱起来了,有时候在IE6下看的很正 ...
- 套接字输入流——InputStream
输入缓冲装置里面必须要包含读取字符的通道,否则就谈不上缓冲了,这个通道就是InputStream,它属于jdk中java.io包的类,有了它我们就可以从源头读取字符,它的来源可以有多种多样,这里主要探 ...