在Eclipse开发C/C++环境配置中我们介绍了Eclipse开发C/C++的环境配置。在Android的开发中,有时我们需要使用JNI的形式来开发。谷歌改良了ndk的开发流程,对于Windows环境下NDK的开发,如果使用的NDK是r7之前的版本,必须要安装Cygwin才能使用NDK。而在NDKr7开始,Google的Windows版的NDK提供了一个ndk-build.cmd的脚本,这样,就可以直接利用这个脚本编译,而不需要使用Cygwin了。只需要将NDT工具配置在external tools configurations就可以了。
一、开发工具的配置
下载ndk,建议下载r8及以上版本,方便使用。在External Tools Configuration中配置javah和ndk-build两个工具。
(1)、配置javah工具,用于将我们的native方法生成对应的.h头文件。
(2)、配置ndk工具,用于将我们实现的.c和.h文件进行编译,生成.so包的形式。
二、简单JNI开发流程。
1、创建一个Android Application工程,在src目录下创建JNITest.java的类。
3、实现我们的头文件中定义的函数,创建com_dsw_jnitst_JNITest.c文件,我们挑一个函数进行实现。
4、然后在jni文件夹下创建Android.mk文件。
5、最后,我们通过创建的ndk工具进行编译,生成.so文件。
在MainActivity中进行使用:
一、开发工具的配置
下载ndk,建议下载r8及以上版本,方便使用。在External Tools Configuration中配置javah和ndk-build两个工具。
(1)、配置javah工具,用于将我们的native方法生成对应的.h头文件。
(2)、配置ndk工具,用于将我们实现的.c和.h文件进行编译,生成.so包的形式。
二、简单JNI开发流程。
1、创建一个Android Application工程,在src目录下创建JNITest.java的类。
public class JNITest {
public native boolean init();
public native int add(int x,int y);
public native void destroy();
}
2、我们点击创建的External工具javah。系统进行编译生成jni文件夹,里面包含创建的.h头文件。
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_dsw_jnitst_JNITest */
#ifndef _Included_com_dsw_jnitst_JNITest
#define _Included_com_dsw_jnitst_JNITest
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_dsw_jnitst_JNITest
* Method: init
* Signature: ()Z
*/
JNIEXPORT jboolean JNICALL Java_com_dsw_jnitst_JNITest_init
(JNIEnv *, jobject);
/*
* Class: com_dsw_jnitst_JNITest
* Method: add
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_com_dsw_jnitst_JNITest_add
(JNIEnv *, jobject, jint, jint);
/*
* Class: com_dsw_jnitst_JNITest
* Method: destroy
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_dsw_jnitst_JNITest_destroy
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
可以看到自动生成对应的函数:Java_com_lucyfyr_HelloWorld_printJNI
Java_ + 包名(com.lucyfyr) + 类名(HelloWorld) + 接口名(printJNI):必须要按此JNI规范来操作;
3、实现我们的头文件中定义的函数,创建com_dsw_jnitst_JNITest.c文件,我们挑一个函数进行实现。
#include <jni.h>
#include "com_dsw_jnitst_JNITest.h"
JNIEXPORT jint JNICALL Java_com_dsw_jnitst_JNITest_add
(JNIEnv *env, jobject obj, jint a, jint b){
return a + b;
}
4、然后在jni文件夹下创建Android.mk文件。
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := JNITst
LOCAL_SRC_FILES := com_dsw_jnitst_JNITest.c
include $(BUILD_SHARED_LIBRARY)
5、最后,我们通过创建的ndk工具进行编译,生成.so文件。
在MainActivity中进行使用:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tv = (TextView) findViewById(R.id.add);
tv.setText("5 + 4=" + addNumber(5,4));
}
static{
System.loadLibrary("JNITst");
}
private int addNumber(int a,int b ){
JNITest jniTest = new JNITest();
return jniTest.add(a, b);
}
}
这样就完成了基本使用。这里主要简单记录下过程,深入的知识还需学习,我们知道jni文件夹毕竟属于Android工程,怎么能编译C代码呢?这里就需要使用我们的CDT搭建的环境,创建一个C的share library工程,将头文件拷贝到C工程,然后进行开发编译测试。