1.NDK和JNI简介:
NDK全称为native development kit本地语言(C&C++)开发包。而对应的是经常接触的Android-SDK,
(softwaredevelopment kit)软件开发包(只支持java语言开发)。众所周知,Android程序运行在Dalvik虚拟机中,NDK允许用户使用类似C / C++之类的原生代码语言执行部分程序。
NDK开发思路:1、下载NDK,并且配置ADT,
2、创建一个native方法,
3、通过javah生成头文件,
4、改cpp类的代码,
5、编辑c语言 ,
6、,添加application.mk文件,
7、运行
按照上述的思路开始一步一步执行
NDK环境搭建:
1、下载NDK, http://developer.android.com/tools/sdk/ndk/index.html
NDK用10版本或者9版本的就可以。然后打开window——>Preferences——>Android——>
NDK——>NDK Location路径选择NDK存放的路径,如图。
注意:eclipce的新版本可能需要安装一个Ndk的J包:com.android.ide.eclipse.ndk_23.0.2.1259578.jar
2、创建一个方法或者类,一般是新建一个类
package com.example.ndkdemo;
public class Hello {
//native 是NDK的关键词
public static native String getString();
}
3、通过javah生成头文件,运行CMD:
4、刷新一下,就会出现头文件(.h)
右键选择Android tools——>Add Native support,生成jni包
close Project——>open Project——>右键选择Android tools——>Add Native support,
就会出现 jni包
把 .cpp的文件改成 .c
5、编译C语言 .mk 文件中的 .cpp 改成 .c
<span style="font-family:Microsoft YaHei;font-size:18px;">-LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := Hello
LOCAL_SRC_FILES := Hello.c//把 .cpp 改成 .c
include $(BUILD_SHARED_LIBRARY) </span>
打开头文件 com_example_nn_Hello.h
<span style="font-family:Microsoft YaHei;">/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_srcndk_Hello */
#ifndef _Included_com_example_srcndk_Hello
#define _Included_com_example_srcndk_Hello
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_example_srcndk_Hello
* Method: getString
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_example_srcndk_Hello_getString
(JNIEnv*, jclass); //复制此代码
#ifdef __cplusplus
}
#endif
#endif</span>
关联完毕以后打开.c文件,实现如下代码:
<span style="font-family:Microsoft YaHei;font-size:18px;">#include <jni.h>
#include <Stdio.h>
#include <stdlib.h>
#include "com_example_srcndk_Hello.h"
JNIEXPORT jstring JNICALL Java_com_example_srcndk_Hello_getString
(JNIEnv *env, jobject obj){
return (*env)->NewStringUTF(env,"hello");
}</span>
(env,"hello")——>打印出来就是"hello"
MainActivity中的代码:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
System.loadLibrary("NDKdemo");//jni中后缀为.c的名字
}
public void cc(View v){ //他是一个按钮,点击按钮需要做的操作
String string = Hello.getString();
System.out.println(string);//打印“你好”
}
}