- 浏览: 191998 次
- 性别:
- 来自: 北京
最新评论
-
fyc0109:
第1, 2, 3在miui4.0.4上测试都不好使, 第3种就 ...
android 关闭app简要说明 -
anjxue:
使用singleInstance这个方法太草率了。
比如我们的 ...
不同的方式启动一个应用,解决不重复启动相同的Activity的方式 -
guoying245:
lasttimes 写道可以尝试在AndroidManifes ...
不同的方式启动一个应用,解决不重复启动相同的Activity的方式 -
zhouxiangang123:
你测试过吗???
android唤醒屏幕--保持屏幕唤醒-Reprinted -
lasttimes:
可以尝试在AndroidManifest.xml文件中的启动a ...
不同的方式启动一个应用,解决不重复启动相同的Activity的方式
Android系统不允许一个纯粹使用C/C++的程序出现,它要求必须是通过Java代码嵌入Native C/C++——即通过JNI的方式来使用本地(Native)代码。因此JNI对Android底层开发人员非常重要。 如何将.so文件打包到.APK 让我们 先 从最简单的情况开始,假如已有一个JNI实现——libxxx.so文件,那么如何在APK中使用它呢? 在我最初写类似程序的时候,我会将libxxx.so文件push到/system/lib/目录下,然后在Java代码中执行System.loadLibrary(xxx),这是个可行的做法,但需要取得/system/lib 目录 的写权限(模拟器通过adb remount取得该权限)。但模拟器 重启之 后libxxx.so文件会消失。现在 我找到了更好的方法,把.so文件打包到apk中分发给最终用户,不管是模拟器 或者 真机 ,都不再需要system分区的写权限。实现步骤如下: 1、在你的项目根目录下建立libs/armeabi目录; 2、将libxxx.so文件copy到 libs/armeabi/下; 3、此时ADT插件自动编译输出的.apk文件中已经包括.so文件了; 4、安装APK文件,即可直接使用JNI中的方法; 我想还需要简单说明一下libxxx.so的命名规则,沿袭Linux传统,lib<something>.so是类库文件名称的格式,但在Java的System.loadLibrary(" something ")方法中指定库名称时,不能包括 前缀—— lib,以及后缀——.so。 准备编写自己的JNI模块 你一定想知道如何编写自己的xxx.so,不过这涉及了太多有关JNI的知识。简单的说:JNI是Java平台定义的用于和宿主平台上的本地代码进行交互的“Java标准”,它通常有两个使用场景:1.使用(之前使用c/c++、delphi开发的)遗留代码;2.为了更好、更直接地与硬件交互并获得更高性能 。 1、首先创建含有native方法的Java类: 2、通过javah命令生成.h文件,内容如下(com_okwap_testjni.h文件): 这是一个标准的C语言头文件,其中的JNIEXPORT、JNICALL是JNI关键字(事实上它是没有任何内容的宏,仅用于指示性说明),而jint、jstring是JNI环境下对int及java.lang.String类型的映射。这些关键字的定义都可以在jni.h中看到。 3、在 com_okwap_testjni.c文件中实现以上方法: 4、编译——两种不同的编译环境 以上的C语言代码要编译成最终.so动态库文件,有两种途径: Android NDK :全称是Native Developer Kit,是用于编译本地JNI源码的工具,为开发人员将本地方法整合到Android应用中提供了方便。事实上NDK和完整源码编译环境一样,都使用Android的编译系统——即通过Android.mk文件控制编译。NDK可以运行在Linux、Mac、Window(+cygwin)三个平台上。有关NDK的使用方法及更多细节请参考以下资料: http://androidappdocs.appspot.com/sdk/ndk/index.html ; 完整源码编译环境 :Android平台提供有基于make的编译系统,为App编写正确的Android.mk文件就可使用该编译系统。该环境需要通过git从官方网站获取完整源码副本并成功编译,更多细节请参考:http://source.android.com/index.html 不管你选择以上两种方法的哪一个,都必须编写自己的Android.mk文件,有关该文件的编写请参考相关文档。 JNI组件的入口函数——JNI_OnLoad()、JNI_OnUnload() JNI组件被成功加载和卸载时,会进行函数回调,当VM执行到System.loadLibrary(xxx)函数时,首先会去执行JNI组件中的JNI_OnLoad()函数,而当VM释放该组件时会呼叫JNI_OnUnload()函数。先看示例代码: JNI_OnLoad()有两个重要的作用: 指定JNI版本:告诉VM该组件使用那一个JNI版本(若未提供JNI_OnLoad()函数,VM会默认该使用最老的JNI 1.1版),如果要使用新版本的JNI,例如JNI 1.4版,则必须由JNI_OnLoad()函数返回常量JNI_VERSION_1_4(该常量定义在jni.h中) 来告知VM。 初始化设定,当VM执行到System.loadLibrary()函数时,会立即先呼叫JNI_OnLoad()方法,因此在该方法中进行各种资源的初始化操作最为恰当。 JNI_OnUnload()的作用与JNI_OnLoad()对应,当VM释放JNI组件时会呼叫它,因此在该方法中进行善后清理,资源释放的动作最为合适。 使用registerNativeMethods方法 对Java程序员来说,可能我们总是会遵循:1.编写带有native方法的Java类;--->2.使用javah命令生成.h头文件;--->3.编写代码实现头文件中的方法,这样的“官方” 流程,但也许有人无法忍受那“丑陋”的方法名称,RegisterNatives方法能帮助你把c/c++中的方法隐射到Java中的native方法,而无需遵循特定的方法命名格式。来看一段示例代码吧: 建立c/c++方法和Java方法之间映射关系的关键是 JNINativeMethod 结构,该结构定义在jni.h中,具体定义如下: 参照上文示例中初始化该结构的代码: 其中比较难以理解的是第二个参数——signature字段的取值,实际上这些字符与函数的参数类型/返回类型一一对应,其中"()" 中的字符表示参数,后面的则代表返回值。例如"()V" 就表示void func(),"(II)V" 表示 void func(int, int),具体的每一个字符的对应关系如下: 字符 Java类型 C/C++类型 数组则以"["开始,用两个字符表示: 字符 java类型 c/c++类型 上面的都是基本类型,如果参数是Java类,则以"L"开头,以";"结尾,中间是用"/"隔开包及类名,而其对应的C函数的参数则为jobject,一个例外是String类,它对应C类型jstring,例如:Ljava/lang /String; 、Ljava/net/Socket; 等,如果JAVA函数位于一个嵌入类(也被称为内部类),则用$作为类名间的分隔符,例如:"Landroid/os/FileUtils$FileStatus;"。 使用registerNativeMethods方法不仅仅是为了改变那丑陋的长方法名,最重要的是可以提高效率,因为当Java类别透过VM呼叫到本地函数时,通常是依靠VM去动态寻找.so中的本地函数(因此它们才需要特定规则的命名格式),如果某方法需要连续呼叫很多次,则每次都要寻找一遍,所以使用RegisterNatives将本地函数向VM进行登记,可以让其更有效率的找到函数。 registerNativeMethods方法的另一个重要用途是,运行时动态调整本地函数与Java函数值之间的映射关系,只需要多次调用registerNativeMethods()方法,并传入不同的映射表参数即可。 JNI中的日志输出 你一定非常熟悉在Java代码中使用Log.x(TAG,“message”)系列方法,在c/c++代码中也一样,不过首先你要include相关头文件。遗憾的是你使用不同的编译环境( 请参考上文中两种编译环境的介绍) ,对应的头文件略有不同。。 如果是在完整源码编译环境下,只要include <utils/Log.h>头文件,就可以使用对应的LOGI、LOGD等方法了,同时请定义LOG_TAG,LOG_NDEBUG等宏值,示例代码如下: 与日志相关的.h头文件,在以下源码路径: 你可以下载以上头文件,来统一两种不同环境下的使用差异。另外,不要忘了在你的Android.mk文件中加入对类库的应用,两种环境下分别是 ifeq ($(HOST_OS),windows) Android为JNI提供的助手方法 在完整源码编译环境下,Android在myeclair\dalvik\libnativehelper\include\nativehelper\JNIHelp.h头文件中 提供了助手函数 ,用于本地方法注册、异常处理等任务,还有一个用于计算方法隐射表长度的宏定义:
eoe特刊第七期《NDK总结》http://blog.eoemobile.com/?p=27
V void void
Z jboolean boolean
I jint int
J jlong long
D jdouble double
F jfloat float
B jbyte byte
C jchar char
S jshort short
[Z jbooleanArray boolean[]
[I jintArray int[]
[F jfloatArray float[]
[B jbyteArray byte[]
[C jcharArray char[]
[S jshortArray short[]
[D jdoubleArray double[]
[J jlongArray long[]
如果你是在NDK环境下编译,则需要#include <android/log.h>,示例代码如下:
#NDK环境下
LOCAL_LDLIBS := -llog
else
#完整源码环境下
LOCAL_SHARED_LIBRARIES := libutils
endif
发表评论
-
Linux input系统(转)
2011-12-26 14:32 2639Linux 系统提供了input子 ... -
android --View 刷新焦点问题
2011-09-19 16:28 3180如果一个activity中,多次调用setContentVie ... -
BinderService And StartService
2011-08-11 00:39 2154当采用Context.startService()方法启 ... -
View 注入事件
2011-08-05 18:19 4153注入是事件处理流程如: 1 .View 接受到上报的Touc ... -
binder
2011-07-22 18:36 1300Android110221:Android binder,pa ... -
超时机制
2011-07-18 19:17 1202static final int OP_PENDING ... -
android-编译
2011-07-18 18:14 2341针对android 选择user版本进行编译的时候,会出现pr ... -
statusbar icon update 转
2011-07-13 18:22 2029公司前些天发现一个状态栏显示图标不正确的Bug,昨天也转给我, ... -
铺捉factoryreset的事件 ---转载
2011-07-09 19:54 1730点击恢复出厂设置后,系统重启,再次进入系统后,一切数据都被清空 ... -
进入recovery模式后,页面选择详解--转载
2011-07-09 19:48 22151【Recovery的进入方式】 1:完全关机,按住音量下+电 ... -
recovery代码流程转载
2011-07-09 19:44 2480===== 应用流程 ... -
recovery.img与boot.img的对比
2011-07-09 19:43 3237今天对比分析了一下reco ... -
recovery流程转载
2011-07-09 19:42 2111=============================== ... -
bootloader 引导进入recovery转载
2011-07-09 19:32 9641昨天大家问recovery怎么工作的,差不多花了俩小时看了下 ... -
JNINativeMethod的参数解析
2011-06-10 17:58 9363Android JNI 使用的数据 ... -
android 编译环境搭建
2011-01-27 14:19 0http://www.360doc.com/content/1 ... -
android 关闭app简要说明
2011-01-24 10:59 7151关闭app的方法: 1.System.exit(0) 激励不 ... -
不同的方式启动一个应用,解决不重复启动相同的Activity的方式
2011-01-20 14:08 16944Android 安装软件后执行“OPEN”引起的Inten ... -
转- ADB(Android Debug Bridge)技术实现
2011-01-20 12:06 2808本帖最后由 ssw 于 2011-1-7 12:07 ... -
Android 的启动流程-转
2011-01-20 11:33 1008Android 根文件系统启动 ...
相关推荐
这个“Android--JNI-Device.zip”文件显然是一个关于Android平台上使用JNI与硬件设备驱动进行交互的教程资料。通过分析描述和标签,我们可以深入探讨JNI在Android中的应用以及如何利用它来调用驱动代码。 1. **JNI...
赠送jar包:zstd-jni-1.4.3-1.jar; 赠送原API文档:zstd-jni-1.4.3-1-javadoc.jar; 赠送源代码:zstd-jni-1.4.3-1-sources.jar; 赠送Maven依赖信息文件:zstd-jni-1.4.3-1.pom; 包含翻译后的API文档:zstd-jni-...
在这个"webrtc-android-jni.rar"压缩包中,我们可以推测其内容可能与Android应用开发中集成WebRTC以及使用JNI进行性能优化有关。下面将详细介绍WebRTC在Android上的实现和JNI的相关知识点。 1. **WebRTC架构**:...
Android Studio 3.4 配置 Android-JNI 开发基础教程详解 Android Studio 3.4 配置 Android-JNI 开发基础是 Android 应用程序开发中的一项重要技术,能够帮助开发者更好地编写 Android 应用程序。本文将详细介绍如何...
标题中的"zstd-jni-1.4.0-1.zip"表明这是一个关于Zstandard (Zstd)的Java Native Interface (JNI)库的压缩包,版本号为1.4.0,可能包含了一些修复和改进。这个库允许Java应用程序利用Zstd的高效压缩和解压缩算法,而...
android-aes-jni, 用于 jni& Java的Android AES示例 android-aes-jni git clone https://github.com/panxw/android-aes-jni.git cd android-aes-jni ndk-build
赠送jar包:zstd-jni-1.4.3-1.jar; 赠送原API文档:zstd-jni-1.4.3-1-javadoc.jar; 赠送源代码:zstd-jni-1.4.3-1-sources.jar; 赠送Maven依赖信息文件:zstd-jni-1.4.3-1.pom; 包含翻译后的API文档:zstd-jni-...
2. **JNI接口**:Java Native Interface (JNI) 是Android平台上Java与原生代码交互的桥梁。NDK提供了头文件和编译工具,使得开发者可以轻松地在Java代码中调用C/C++函数,反之亦然。 3. **交叉编译**:NDK包含了一...
Android JNI(Java Native Interface)是Android平台上的一个重要概念,它允许Java代码和其他语言写的代码进行交互,特别是C和C++。JNI在Android开发中的应用广泛,包括性能优化、调用本地库、游戏开发等场景。以下...
赠送jar包:zstd-jni-1.4.4-3.jar; 赠送原API文档:zstd-jni-1.4.4-3-javadoc.jar; 赠送源代码:zstd-jni-1.4.4-3-sources.jar; 赠送Maven依赖信息文件:zstd-jni-1.4.4-3.pom; 包含翻译后的API文档:zstd-jni-...
See dlib-android for JNI lib. Refer to dlib-android/jni/jnilib_ex Grap the source $ git clone https://github.com/tzutalin/dlib-android-app.git Features Support HOG detector HOG Face detection ...
赠送jar包:zstd-jni-1.3.2-2.jar; 赠送原API文档:zstd-jni-1.3.2-2-javadoc.jar; 赠送源代码:zstd-jni-1.3.2-2-sources.jar; 赠送Maven依赖信息文件:zstd-jni-1.3.2-2.pom; 包含翻译后的API文档:zstd-jni-...
赠送jar包:zstd-jni-1.3.8-1.jar; 赠送原API文档:zstd-jni-1.3.8-1-javadoc.jar; 赠送源代码:zstd-jni-1.3.8-1-sources.jar; 赠送Maven依赖信息文件:zstd-jni-1.3.8-1.pom; 包含翻译后的API文档:zstd-jni-...
赠送jar包:zstd-jni-1.3.8-1.jar; 赠送原API文档:zstd-jni-1.3.8-1-javadoc.jar; 赠送源代码:zstd-jni-1.3.8-1-sources.jar; 赠送Maven依赖信息文件:zstd-jni-1.3.8-1.pom; 包含翻译后的API文档:zstd-jni-...
android-jni-audio-codecAndroid JNI audio codec from android source, now include amr , pcma, pcmu codec.Android JNI 层的音频编解码库,现在已经合入的有 AMR, PCMA, PCMU 编码.说明本文参考了 , 表示感谢. 他...
"ffmpeg-android-jni.zip" 是一个包含了FFmpeg编译后针对Android平台的本地库文件(so文件)以及相关的头文件(.h)和源代码文件(.c)的压缩包。这个压缩包的主要目的是让开发者能够将FFmpeg的功能集成到Android...
"jni-android-studio1.3.1"这个项目很可能是为了帮助开发者入门Android Studio中的JNI开发。 Android Studio是Google提供的官方Android应用开发集成开发环境(IDE),它提供了丰富的工具和功能,使得开发者可以方便...
在NDK中,开发者可以编写JNI接口,然后在Android应用的Java层通过这些接口来调用本地代码。 Android-ndk-r23b包含了一系列的编译器、链接器和其他工具,用于将C/C++源代码编译成可以在Android设备上运行的机器码。...
**JNI(Java Native Interface)**是Android NDK的核心组成部分,它提供了Java和本地代码之间的接口。开发者可以通过JNI在Java应用中调用C/C++库,或者在C/C++代码中调用Java方法。这对于需要高效处理的计算任务,如...