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你就算入门了。

0 0
原创粉丝点击