Android NDK入门(下)
来源:互联网 发布:linux虚拟机修改ip 编辑:程序博客网 时间:2024/06/07 08:18
前言:本次讲解以android studio开发环境为例,主要分析代码实现思想,使用之前您需要以下组件:
LLDB,CMake的,和NDK
1.我们在使用NDK的项目中会有一个包
jni
包下我们放置着两个文件
Android.mk和.c
Android.mk里面
或
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := hello LOCAL_SRC_FILES := hello.c include $(BUILD_SHARED_LIBRARY)
Android.mk是NDK工程的Makefile
JNI概念 : JNI是本地编程接口。它允许Java虚拟机(VM)内运行的Java代码与其他编程语言(如C,C ++和汇编)编写的应用程序和库能进行交互操作。
JNI最重要的优点是它不会对底层Java VM的实现施加任何限制。因此,Java VM供应商可以添加对JNI的支持,而不会影响VM的其他部分。程序员可以编写本机应用程序或库的一个版本,并期望它与支持JNI的所有Java VM一起工作。
正常情况下的Android框架 : 最顶层是Android的应用程序代码, 上层的应用层 和 应用框架层 主要是Java代码, 中间有一层的Framework框架层代码是 C/C++代码, 通过Framework进行系统调用, 调用底层的库 和linux 内核;
使用JNI时的Android框架 : 绕过Framework提供的调用底层的代码, 直接调用自己写的C代码, 该代码最终会编译成为一个库, 这个库通过JNI提供的一个Stable的ABI 调用linux kernel;ABI是二进制程序接口 application binary interface.
hello.c文件内容:
#include <jni.h>/* * 方法名称规定 : Java_完整包名类名_方法名() * JNIEnv 指针 * * 参数介绍 : * env : 代表Java环境, 通过这个环境可以调用Java中的方法 * thiz : 代表调用JNI方法的对象, 即MainActivity对象 */jstring Java_完整包名_类名_方法名(JNIEnv *env, jobject thiz) { /* * 调用 android-ndk-r9c\platforms\android-8\arch-arm\usr\include 中jni.h中的方法 * jni.h 中定义的方法 jstring (*NewStringUTF)(JNIEnv*, const char*); */ return (*env)->NewStringUTF(env, "hello world jni");}
查看源码:
主活动界面代码:
public class MainActivity extends AppCompatActivity { //静态代码块加载C语言库文件 static { System.loadLibrary("hello"); } /* * 声明一个native方法 * 这个方法在Java中是没有实现的, 没有方法体 * 该方法需要使用C语言编写 */ public native String helloFromJNI(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void onJni(View view) { ((TextView) findViewById(R.id.textView)).setText("打印:" + helloFromJNI()); }}
编译hello.c文件,有篇不错的文章:
http://www.2cto.com/kf/201607/526887.html
到这里,如果你都自己动手实现了一遍,ndk你就算入门了。
- Android NDK入门(下)
- ubuntu下 Android NDK入门
- windows下android ndk开发入门
- 【Android】Android NDK入门
- Window下使用android NDK开发Android应用-入门篇
- Android NDK 使用入门
- Android NDK入门搭建
- Android NDK编程入门
- Android: NDK编程入门
- Android ndk开发入门
- Android NDK编程入门
- android ndk 入门实践
- android ndk 入门
- Android NDK入门
- Android NDK 入门
- Android NDK 入门小计
- Android NDK编程入门
- Android NDK入门理解
- java中设置session存在整个web的时间方法
- Java 数组
- drupal
- iOS中的锁
- 2017.1.9_U-boot的常用命令
- Android NDK入门(下)
- 浏览器兼容性:控制intput输入框高度
- OpenCV编程实现LeCun论文(Gradient-Based Learning Applied to Document Recognition)中的CNN
- httpclient设置本机出口IP
- 北京上海的孩子周末最“辛苦”
- 微软100题13题(输入一个单向链表,输出该链表中倒数第k个结点。链表的倒数第0个结点为链表的尾指针)
- 笔记
- 数据库设计
- Java JDK最新版本及历史版本的下载流程