about JNI
1、Java对C/C++事件处理的封装
JIT(Just in Time、Java语言的原动态编译技术)
大多数的游戏引擎都是使用可移植的C语言开发的,然后通过简单的封装以适应特殊的平台。
2、Android.mk文件描述了要编译的原生库的模块名称和所需的源文件。
3、
JNIEnv* env : 对JNI环境的引用
jclass class : 对需要调用原生函数的Java类的引用
jobjectArray jargv : 对Java传进来的字符串数组参数的引用,被封装成JNI的jobjectArray类型。
通过它来提取从Java层传递过来的字符串,并将它们发送到原生main函数。
lib.c 包含原生库的主要代码
Android.mk Android的生成文件(makefile),用于构建原生库。
LOCAL_PATH : 必须位于文件的最开始。用来定位源文件的位置,返回当前目录的路径
相应的Android.mk文件会象下面这样:
---------- cut here ------------------
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE:= helloworld
LOCAL_SRC_FILES := helloworld.c
include $(BUILD_SHARED_LIBRARY)
---------- cut here ------------------
关于LOCAL_CFLAGS
在某些时候,编译源码需要定义宏变量,这个时候,我们可以直接在对应的源码里面去修改,但也有一些情况,我们是没法在别人的源码里定义宏变量的,这个时候,就需要使用到LOCAL_CFLAGS 了 ,举例如下:
LOCAL_CFLAGS += -D__FAVOR_BSD
这行代码的作用就是在原有的cflags基础上,再定义一个宏变量__FAVOR_BSD
类似于#define __FAVOR_BSD
include $(BUILD_SHARED_LIBRARY)是用来指示将当前模块编译为共享库,前缀为lib,后缀为.so。
还有另外一个BUILD_STATIC_LIBRARY,是用来指示将当前模块编译为静态库的,前缀为.a,后缀为.a。
============================================================================
最近在移植一个linux下的c库到android,学习编写Android.mk文件,特地花了点时间学习。
在网上搜了很多,最后发现还是看ndk的文档最直接,也最全面,下面的总结主要是根据ndk提供的文档编写的。
1、单一的Android.mk文件:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hello-jni
LOCAL_SRC_FILES := hello-jni.c
include $(BUILD_SHARED_LIBRARY)
LOCAL_PATH必须位于Android.mk文件的最开始。它是用来定位源文件的位置,$(call my-dir)的作用就是返回当前目录的路径。
include $(CLEAR_VARS)的作用是清除一些变量的值,但是LOCAL_PATH除外。
LOCAL_MODULE是用来指定当前待编译模块的名称,在示例中的模块名称为hello-jni
LOCAL_SRC_FILES是用来指定参与编译的源代码文件。这里只编译hell0-jin.c
include $(BUILD_SHARED_LIBRARY)是用来指示将当前模块编译为共享库,前缀为lib,后缀为.so。
还有另外一个BUILD_STATIC_LIBRARY,是用来指示将当前模块编译为静态库的,前缀为.a,后缀为.a。
这就是一个最简单的Android.mk的结构。可能还有另外一点需要介绍:
LOCAL_C_INCLUDES:=include 这个是用来指定在编译时即将使用的c头文件的位置,以当前目录为起点。
2、定义多个Android.mk文件。
有的时候,需要编译的模块比较多,我们可能会将对应的模块放置在相应的目录中,这样,我们可以在每个目录中定义对应的Android.mk文件(类似于上面的写法),最后,在根目录放置一个Android.mk文件,内容如下:
include $(call all-subdir-makefiles)
只需要这一行就可以了,它的作用就是包含所有子目录中的Android.mk文件
3、也可以在一个Android.mk文件里包含多个模块。
很直观的想法就是将第一个Android.mk文件的内容复制一份,然后修改。我最开始也是这样做的,但是后来出现问题了,在第二个模块中的源码找不到,最后还是看文档,发现里面已经有示例解释了:
LOCAL_PATH := $(call my-dir)
IMPORTANT NOTE: Due to the way GNU Make works, this really returns
the path of the *last* *included* *Makefile* during the parsing of
build scripts. Do not call my-dir after including another file.
大意是:基于GNU make的工作方式,$(call my-dir)会返回在解析build脚本时,遇到的最后一个 include中涉及的目录。
所以,很多时候,在这个Android.mk里面只需要调用一次$(call my-dir)就够了,如果所有的源文件都在一个目录中。
如果需要的话,可以在第一次调用call my-dir的时候,将值保存下来,比如:
MY_LOCAL_PATH := $(call my-dir)
LOCAL_PATH := $(MY_LOCAL_PATH)
然后,在另外一个模块中,继续如下定义:
LOCAL_PATH := $(MY_LOCAL_PATH)
在编译一般的c源代码时,上面的基本可以满足了,等后面需要,再继续补充吧!
补充:
关于LOCAL_CFLAGS
在某些时候,编译源码需要定义宏变量,这个时候,我们可以直接在对应的源码里面去修改,但也有一些情况,我们是没法在别人的源码里定义宏变量的,这个时候,就需要使用到LOCAL_CFLAGS 了 ,举例如下:
LOCAL_CFLAGS += -D__FAVOR_BSD
这行代码的作用就是在原有的cflags基础上,再定义一个宏变量__FAVOR_BSD
类似于#define __FAVOR_BSD
======================================================================
JNI类型
1、基本数据类型
boolean - jboolean - unsigned 8 bits
byte - jbyte - signed 8 bits
char - jchar - unsigned 16 bits
short - jshort - signed 16 bits
int - jint - signed 32 bits
long - jlong - signed 64 bits
float - jfloat - 32 bits
double - jdouble - 64 bits
2、引用类型
当在C语言中使用时,所有的JNI引用类型都被定义为jobject类型
int[]在JNI中的表示[I
int[][]在JNI中的表示[[I
基本类型的域
Z boolean
B byte
C char
S short
I int
J long
F float
D double
引用类型的域
Ljava/lang/String; - String
[I - int[]
[Ljava/lang/Object Object[]
Method说明
JNI方法声明规则:先写参数列表,再写返回类型
String f() - ()Ljava/lang/String;
long f(int i, Class c) - (ILjava/lang/Class;)J
String(byte[] bytes) - ([B)Ljava/lang/String;
about JNI的更多相关文章
- android studio 使用 jni 编译 opencv 完整实例 之 图像边缘检测!从此在andrid中自由使用 图像匹配、识别、检测
目录: 1,过程感慨: 2,运行环境: 3,准备工作: 4,编译 .so 5,遇到的关键问题及其解决方法 6,实现效果截图. (原创:转载声明出处:http://www.cnblogs.com/lin ...
- 【走过巨坑】android studio对于jni调用及运行闪退无法加载库的问题解决方案
相信很多小伙伴都在android开发中遇到调用jni的各种巨坑,因为我们不得不在很多地方用到第三方库so文件,然而第三方官方通常都只会给出ADT环境下的集成方式,而谷歌亲儿子android studi ...
- Android游戏开发实践(1)之NDK与JNI开发03
Android游戏开发实践(1)之NDK与JNI开发03 前面已经分享了两篇有关Android平台NDK与JNI开发相关的内容.以下列举前面两篇的链接地址,感兴趣的可以再回顾下.那么,这篇继续这个小专 ...
- JNI 备注
本文记录一个基础的JNI例子及过程中遇到的问题解决. 1.定义一个JAVA类如下: package jnidemo01; public class JniHello { public native v ...
- Android游戏开发实践(1)之NDK与JNI开发01
Android游戏开发实践(1)之NDK与JNI开发01 NDK是Native Developement Kit的缩写,顾名思义,NDK是Google提供的一套原生Java代码与本地C/C++代码&q ...
- Android游戏开发实践(1)之NDK与JNI开发02
Android游戏开发实践(1)之NDK与JNI开发02 承接上篇Android游戏开发实践(1)之NDK与JNI开发01分享完JNI的基础和简要开发流程之后,再来分享下在Android环境下的JNI ...
- 关于jni编译32位、64位动态库(Android.mk和Application.mk文件)
最近新项目需要编译64位的动态库,这里记录如何配置. 在jni目录下加入Android.mk和Application.mk文件. Application.mk APP_ABI := armeabi a ...
- android JNI 调用NDK方法
@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...
- jni操作jobject
一. 注册JNI函数 1. 静态方法 一般使用javah进行编译,生成很长的文件名和函数名字,这个书写不方便,影响运行效率. 2. 动态注册 使用JNINativeMe ...
- JNI开发的常见错误
1. 写错了load的library java.lang.UnsatisfiedLinkError: Couldn't load hell0: findLibrary returned null 2. ...
随机推荐
- JAVA之关于super的用法
JAVA之关于super的用法 路漫漫其修远兮,吾将上下而求索.——屈原<离骚> 昨天写this用法总结的时候,突然产生了一个问题,请教别人之后,有了自己的一点认识.还是把它写下来,为 ...
- SharePoint 2013 开发——APP开发的考虑和建议
博客地址:http://blog.csdn.net/FoxDave 需要考虑的方面: 1. 记得CSOM授予网站集及以下的权限,而场解决方案需要整个场的访问权限. 2. 由于应用程序是彼此完全独立 ...
- 对比学习UIKit和AppKit--入门级
UIKit是用来开发iOS的应用的,AppKit是用来开发Mac应用的,在使用过程中他们很相似,可是又有很多不同之处,通过对比分析它们的几个核心对象,可以避免混淆. UIKit和AppKit都有一个A ...
- 重拾java系列一java基础(2)
1.分支流程控制 if(布尔表达式/分支条件){ //语句块} if(布尔表达式/分支条件){ //语句块1}else{ //语句块2} if(条件1){ //语句块1}else if(条件2 ...
- SVG 2D入门4 - 笔画与填充
前面我们重点都在总结各类形状,文本和图片,接下来,我们还是和讨论canvas一样,总结一下颜色处理,也就是填充和边框效果:你会发现这里的内容与canvas基本上是一致的.这些属性既可以以属性的形式写在 ...
- 12-26 tableView的学习心得
一:基础部分 UITableView的两种样式: 注意是只读的 1.UITableViewStytlePlain(不分组的) n 2.UITableViewStyleGrouped(分组的) 二:如何 ...
- MouseJack:利用15美元的工具和15行代码控制无线鼠标和键盘
Bastille的研究团队发现了一种针对蓝牙键盘鼠标的攻击,攻击者可以利用漏洞控制你的电脑操作.研究团队将此攻击命名为MouseJack. 七大厂商皆中招 软件工程师马克纽林说:“利用假冒的无线电脑鼠 ...
- HDOJ-三部曲一(搜索、数学)- A Knight's Journey
A Knight's Journey Time Limit : 2000/1000ms (Java/Other) Memory Limit : 131072/65536K (Java/Other) ...
- ACDream-C - Transformers' Mission(Dijastra最短路径)
dijstra求最短路径:经典应用题目: 题意:给你一个带权值无向图,权值是A点到B点的时间,然后告诉你起点,一个人可以去炸掉一个结点或多个节点,也可以派多个人,最终这些人在终点集合,问最后一个到达终 ...
- Bootstrap全局css
HTML中的所有标题标签,<h1>到<h6>均可使用.另外,还提供了.h1到.h6类,为的是给内联(inline)属性的文本赋予标题的样式.在标题内还可以包含<small ...