前言:本次讲解以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你就算入门了。