NDK(2)使用eclipse + ndk开发过程演示,含CPU架构编译
环境linux + eclipse + adt + ndk
1,在ide中配置ndk
下载ndk,在eclipse中配置
2,使用ndk编程
2.1 给项目添加ndk 支持
右键 项目名 -->Android Tools -->Add Native Support...
生成jni目录,包含xxx.cpp和Android.mk ,xxx.cpp是c/c++源文件
Android.mk 是ndk代码配置文件,包括include,要编译的源文件名等等,如下: 源文件名之间用空格分开
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := NdkSample
LOCAL_SRC_FILES := NativeStudent.cpp NativeTeacher.cpp Animal.cpp
include $(BUILD_SHARED_LIBRARY)
2.2 在java工程中添加本地类或函数(用native)
将来它们的实现在jni目录下.
1 public class NativeStudent { 2 //ndk编程第2步,在java中声明方法. 3 public native String getName(); 4 public native static String getCls(); 5 public native int add(int x,int y); 6 }
2.3 使用Ant 批量创建头文件
javah -jni 也可以生成头文件,但是它是命令,一次只能生成一个,用Ant可以批量生成和指定生成的目录.下面是Ant步骤:
a) 在jni下新建一个ant源文件,它是个xml,如: create_native_headers.xml
b) 在xml中生成模板代码,右健-->Open With ->Ant Editor (没有的话去Other里找),用代码提示功能生成模板代码,Ctrl+Space或Alt+/ 然后选Buildfile template
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!-- ====================================================================== 3 Aug 15, 2015 11:03:46 AM 4 5 NdkSample 6 description 7 8 efdfsdf 9 ====================================================================== --> 10 <project name="NdkSample" default="BuildAll"> <!-- default="BuildAll" 指定要编译的target--> 11 <description> 12 description 13 </description> 14 15 <!--target 是一个目标单位,一般一个target对应一个java类--> 16 <target name="BuildAll" description="description"> 17 <!-- antcall target="NativeStudent" 其中antcall是引用其它target --> 18 <antcall target="NativeStudent"></antcall> 19 <antcall target="NativeTeacher"></antcall> 20 </target> 21 22 <!-- ================================= 23 target: NativeStudent 24 ================================= --> 25 <target name="NativeStudent" description="description"> 26 <!-- destdir 是生成的xxx.h存放的目录,classpath是java类的class所在的位置,class是java类的包名. --> 27 <javah destdir="." classpath="../bin/classes" class="com.example.ndksample.NativeStudent"></javah> 28 </target> 29 30 <!-- - - - - - - - - - - - - - - - - - 31 target: NativeTeacher 32 - - - - - - - - - - - - - - - - - --> 33 <target name="NativeTeacher" description="description"> 34 <javah destdir="." classpath="../bin/classes" class="com.example.ndksample.NativeTeacher"></javah> 35 </target> 36 37 </project>
c) 在ant view 中添加 create_native_headers.xml (下图中 ok 右边 的第一个按钮 Add Buildfiles)
d) 运行ant,双击或点运行按钮 开始build ant 源文件 ,成功后就生成相应的 xxx.h
2.4 在使用ndk代码前要将它们导入到java项目中
1 public class MainActivity extends Activity { 2 TextView output; 3 4 //ndk编程第4步,load libNdkSample.so 它在Android.mk中指定的 5 /* 6 * LOCAL_MODULE := NdkSample 7 */ 8 static{ 9 System.loadLibrary("NdkSample"); 10 } 11 //... 12 }
2.5 在java中使用那些ndk中的c/c++代码
1 public class MainActivity extends Activity { 2 TextView output; 3 4 //ndk编程第4步,load libNdkSample.so 它在Android.mk中指定的 5 /* 6 * LOCAL_MODULE := NdkSample 7 */ 8 static{ 9 System.loadLibrary("NdkSample"); 10 } 11 12 public void onClickNativeTeacherSay(View btn){ 13 NativeTeacher t = new NativeTeacher(); 14 output.setText(t.say()); 15 } 16 public void onClickNativeStudentClassName(View btn){ 17 output.setText(NativeStudent.getCls()); 18 } 19 20 @Override 21 protected void onCreate(Bundle savedInstanceState) { 22 super.onCreate(savedInstanceState); 23 setContentView(R.layout.activity_main); 24 output = (TextView) findViewById(R.id.tv_output); 25 } 26 }
2.6 面向多种CPU架构编译
在jni目录下新建 Application.mk
APP_ABI := x86 armeabi
x86 和 armeabi 是两种架构,它们之间用空格 ,
all代表所有,学用的有:arm64-v8a ,armeabi,armeabi-v7a,mips,mips64,x86,x86_64