之前写了一篇JNI的使用,这里其实也是JNI的使用,只不过现在的使用更加方便,不需要什么cygwin或者gnu去创建那边麻烦,直接eclipse完成所有操作。

先前的一篇:http://xuzhiwei.blog.51cto.com/978424/976839


1、首先现在Android的SDK和NDK

2、sdk中以及集成了eclipse,打开eclipse并下载CDT插件支持,一会儿写c++使用。

CDT下载地址:http://www.eclipse.org/cdt/

3、配置NDK环境,windows->preferences->Android->NDK进行配置。

4、创建项目

5、创建完成后,右击项目Android Tools->Add Native Support就可以了。


自动为我们生成了JNI的目录,以及编译的Android.mk等文件。


6、好了,开始写代码。

创建NativeUtils.java

packagecom.xzw.firstndk;/***与c++的接口类,用来生成.h头文件*@authorxzw**/publicclassNativeUtils{publicstaticnativeStringgetWords();}


现在要生成.h的头文件,之前是在cmd里面通过javah命令来生成的,这里我们使用ant来自动为我们生成头文件。


创建build_headers.xml然后以ant editor的方式打开,使用快捷键ALT+/生成模板。

<?xmlversion="1.0"encoding="UTF-8"?><!--======================================================================2014-6-19下午2:07:38FirstNDKdescriptionXMYJ======================================================================--><projectname="FirstNDK"default="BuilderHeaders"><description>description</description><!--=================================target:BuilderHeaders=================================--><targetname="BuilderHeaders"depends="BuildNativeHeader"/><!-------------------target:BuildNativeHeader-------------------><targetname="BuildNativeHeader"><!--destdir:输出目标目录classpath:类路径class:要生成的类--><javahdestdir="./jni"classpath="bin/classes"class="com.xzw.firstndk.NativeUtils"></javah></target></project>

右击运行ant,然后刷新jni目录就可以看到.h文件了,也把一些依赖库给我们创建好了,方便很多。

如图

打开com_xzw_firstndk_NativeUtils.h可以看到:

/*DONOTEDITTHISFILE-itismachinegenerated*/#include<jni.h>/*Headerforclasscom_xzw_firstndk_NativeUtils*/#ifndef_Included_com_xzw_firstndk_NativeUtils#define_Included_com_xzw_firstndk_NativeUtils#ifdef__cplusplusextern"C"{#endif/**Class:com_xzw_firstndk_NativeUtils*Method:getWords*Signature:()Ljava/lang/String;*/JNIEXPORTjstringJNICALLJava_com_xzw_firstndk_NativeUtils_getWords(JNIEnv*,jclass);#ifdef__cplusplus}#endif#endif


现在开始实现,打开FirstNDK.cpp,引入.h头文件

eclipse提示功能也是很不错的,alt+/快捷快速提示,

#include<jni.h>#include"com_xzw_firstndk_NativeUtils.h"/**Class:com_xzw_firstndk_NativeUtils*Method:getWords*Signature:()Ljava/lang/String;*/JNIEXPORTjstringJNICALLJava_com_xzw_firstndk_NativeUtils_getWords(JNIEnv*env,jclassclazz){returnenv->NewStringUTF("hellofirtndk");}

好了,c++部分ok了,现在来调用咯。

packagecom.xzw.firstndk;importandroid.app.Activity;importandroid.os.Bundle;importandroid.widget.TextView;publicclassMainActivityextendsActivity{TextViewresultText;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);resultText=(TextView)findViewById(R.id.result);//调用c++的输出,显示出来resultText.setText(NativeUtils.getWords());}static{System.loadLibrary("FirstNDK");}}


完成了,默认生成的是armeabi架构的so文件,如果需要生成多中架构的支持的so,需要在jni目录下创建Application.mk文件。

APP_ABI:=armeabiarmeabi-v7ax86

添加好了,运行起来就可以在libs目录下看到这几个架构的文件夹了。搞定手工了。