Eclipse ADT+NDK+CDT综合开发环境配置

时间:2023-01-24 20:13:21

使用Eclipse开发Android应用过程中要使用NDK,但需要打开CYGWIN对C/C++代码进行编译,虽然可以将NDK和Cygwin整合到Eclipse中,但打开Android工程目录下的C/C++代码并不能使用"Open Declaration"等功能 ,而且编辑源代码时也不能给出拼写,函数不存在等错误提示,以下配置既可以避免要切换到Cygwin中对C/C++代码进行编译,也能在Android工程中像在CDT中编译源代码一样,而且C/C++代码的编译和Android代码的编译是独立的。


一、准备工作

这里已经安装好了Eclipse,装好了Cygwin、ADT、CDT、Java环境。


二、将CDT整合到Android环境中

1.新建一个C工程,工程名为Test_C,Project type可以任选,这里选择Empty Project,Toolchains也可以任选一个,这里选择Cygwin GCC,然后点击"Finish"

Eclipse ADT+NDK+CDT综合开发环境配置

2.右键点击刚才新建的C工程,选择Properities->C/C++ Build,确保Builder Settings中Builder type为External builder,打开Behaviour标签,将取消Build和Clean选中状态

Eclipse ADT+NDK+CDT综合开发环境配置

3.新建一个Android工程Test,将Test_C目录下的.cproject文件复制到Android工程目录下

同时打开Test_C目录下的.project文件,将<buildSpec>标签和<natures>标签下的内容都复制到Android工程目录下的.project文件相应的标签下。

Eclipse ADT+NDK+CDT综合开发环境配置

4.右键点击Android工程Test,选择Close project,然后重新打开,打开Test属性会发现多了C/C++的设置属性

Eclipse ADT+NDK+CDT综合开发环境配置

这个时候我们再新建一个C文件会发现有错误提示了

Eclipse ADT+NDK+CDT综合开发环境配置

这说明已经成功将CDT整合到Android工程中了,接下来我们添加相应的头文件即可

这里string.h在NDK目录中,jni.h在jdk目录下,添加完后可以发现代码中函数已经可以高亮显示了,遇到错误也会有提示。接下来将NDK+CYGWIN也整合进去

Eclipse ADT+NDK+CDT综合开发环境配置

三、将NDK+Cygwin编译环境整合到Android工程中

1.打开Android工程属性选择Builders->New->Program点击OK

Eclipse ADT+NDK+CDT综合开发环境配置

2.设置cygwin路径和输入参数

Eclipse ADT+NDK+CDT综合开发环境配置

Arguments为输入参数,如果每次都要输入工程路径太麻烦了,这里可以这么做:

点击Variables->Edit Variables->New在弹出对话框中设置name为workspace_cyg,Value为cygwin命令行下workspace目录即e/android/workspace,然后Arguments命令可以改成如下:

--login -c "cd /cygdrive/${workspace_cyg}/${project_name}/jni && $NDK9/ndk-build"

($NDK9为cygwin中定义NDK目录的环境变量

${project_name}为eclipse中定义工程文件名的变量

)

3.Refresh和Build Options自行配置,这里配置如下

Eclipse ADT+NDK+CDT综合开发环境配置

Eclipse ADT+NDK+CDT综合开发环境配置

到这里整个配置就完成了,如果要编译C/C++代码,右键点击Android项目选择"Build Project"即可,运行Android程序不变,这里可以将Android程序的编译和C/C++代码的编译想分离。以下是只编译C/C++代码截图:

Eclipse ADT+NDK+CDT综合开发环境配置

附上hello-jni.c和Android.mk

#include <string.h>
#include <jni.h>

jstring Java_com_example_hellojni_HelloJni_stringFromJNI(JNIEnv* env,
jobject thiz) {
return (*env)->NewStringUTF(env, "Hello from JNI !");
}
void Java_com_example_hellojni_HelloJni_printString(JNIEnv* env, jobject thiz,
jstring str) {
const char* ch = (*env)->GetStringUTFChars(env,str,NULL);
(*env)->ReleaseStringUTFChars(env,str,ch);
}

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := hello-jni
LOCAL_SRC_FILES := hello-jni.c

LOCAL_LDLIBS := -llog

include $(BUILD_SHARED_LIBRARY)