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

 

posted @ 2015-08-14 19:35  f9q  阅读(287)  评论(0编辑  收藏  举报