Windows下NDK环境搭建

     在windows平台上新的NDK版本(r7及其以上)可不借助cygwin就能编译链接产生.so动态链接库文件。 r7以上需要使用cygwin或者r7以下 的请自行搜索。

     环境eclipse 4.4 安装ADT插件。 

     NDK android-ndk-r10d 32位的。本人的android环境目前都是32位。

     android-ndk-r10d 是个exe的压缩包。双击即可解压。

     打开Eclipse,点Window->Preferences->Android->NDK,设置NDK路径,例如我的是D:\android\PlatformSDKs\android-ndk-r10d

     Windows下NDK环境搭建_第1张图片

      新建一个Android工程myandroidjni,在工程上右键点击Android Tools->Add Native Support...,然后给我们的.so文件取个名字,例如:myandroidjnindk

      创建完毕后。会多出一个JNI的文件夹。和其他一些相关的文件。在JNI下有Android.mk和myandroidjnindk.cpp文件。Android.mk是NDK工程的Makefile,myandroidjnindk.cpp就是NDK的源文件。

     在创建的MainActivity 增加以下native方法:


 public  native String stringformJNI();
 public native String getImie();

保存。到classes目录下用javah生成对应C/C++的头文件。

javah -classpath D:\androidsdk\platforms\android-18\android.jar;. -jni com.example.myandroidjni.MainActivity

执行完毕后,会在classes下生成一个C/C++的头文件。我们将它include到cpp文件中。

#include "../bin/classes/com_example_myandroidjni_MainActivity.h"

生成的头文件内容如下:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_myandroidjni_MainActivity */

#ifndef _Included_com_example_myandroidjni_MainActivity
#define _Included_com_example_myandroidjni_MainActivity
#ifdef __cplusplus
extern "C" {
#endif
#undef com_example_myandroidjni_MainActivity_MODE_PRIVATE
#define com_example_myandroidjni_MainActivity_MODE_PRIVATE 0L
#undef com_example_myandroidjni_MainActivity_MODE_WORLD_READABLE
#define com_example_myandroidjni_MainActivity_MODE_WORLD_READABLE 1L
#undef com_example_myandroidjni_MainActivity_MODE_WORLD_WRITEABLE
#define com_example_myandroidjni_MainActivity_MODE_WORLD_WRITEABLE 2L
#undef com_example_myandroidjni_MainActivity_MODE_APPEND
#define com_example_myandroidjni_MainActivity_MODE_APPEND 32768L
#undef com_example_myandroidjni_MainActivity_MODE_MULTI_PROCESS
#define com_example_myandroidjni_MainActivity_MODE_MULTI_PROCESS 4L
#undef com_example_myandroidjni_MainActivity_MODE_ENABLE_WRITE_AHEAD_LOGGING
#define com_example_myandroidjni_MainActivity_MODE_ENABLE_WRITE_AHEAD_LOGGING 8L
#undef com_example_myandroidjni_MainActivity_BIND_AUTO_CREATE
#define com_example_myandroidjni_MainActivity_BIND_AUTO_CREATE 1L
#undef com_example_myandroidjni_MainActivity_BIND_DEBUG_UNBIND
#define com_example_myandroidjni_MainActivity_BIND_DEBUG_UNBIND 2L
#undef com_example_myandroidjni_MainActivity_BIND_NOT_FOREGROUND
#define com_example_myandroidjni_MainActivity_BIND_NOT_FOREGROUND 4L
#undef com_example_myandroidjni_MainActivity_BIND_ABOVE_CLIENT
#define com_example_myandroidjni_MainActivity_BIND_ABOVE_CLIENT 8L
#undef com_example_myandroidjni_MainActivity_BIND_ALLOW_OOM_MANAGEMENT
#define com_example_myandroidjni_MainActivity_BIND_ALLOW_OOM_MANAGEMENT 16L
#undef com_example_myandroidjni_MainActivity_BIND_WAIVE_PRIORITY
#define com_example_myandroidjni_MainActivity_BIND_WAIVE_PRIORITY 32L
#undef com_example_myandroidjni_MainActivity_BIND_IMPORTANT
#define com_example_myandroidjni_MainActivity_BIND_IMPORTANT 64L
#undef com_example_myandroidjni_MainActivity_BIND_ADJUST_WITH_ACTIVITY
#define com_example_myandroidjni_MainActivity_BIND_ADJUST_WITH_ACTIVITY 128L
#undef com_example_myandroidjni_MainActivity_CONTEXT_INCLUDE_CODE
#define com_example_myandroidjni_MainActivity_CONTEXT_INCLUDE_CODE 1L
#undef com_example_myandroidjni_MainActivity_CONTEXT_IGNORE_SECURITY
#define com_example_myandroidjni_MainActivity_CONTEXT_IGNORE_SECURITY 2L
#undef com_example_myandroidjni_MainActivity_CONTEXT_RESTRICTED
#define com_example_myandroidjni_MainActivity_CONTEXT_RESTRICTED 4L
#undef com_example_myandroidjni_MainActivity_RESULT_CANCELED
#define com_example_myandroidjni_MainActivity_RESULT_CANCELED 0L
#undef com_example_myandroidjni_MainActivity_RESULT_OK
#define com_example_myandroidjni_MainActivity_RESULT_OK -1L
#undef com_example_myandroidjni_MainActivity_RESULT_FIRST_USER
#define com_example_myandroidjni_MainActivity_RESULT_FIRST_USER 1L
#undef com_example_myandroidjni_MainActivity_DEFAULT_KEYS_DISABLE
#define com_example_myandroidjni_MainActivity_DEFAULT_KEYS_DISABLE 0L
#undef com_example_myandroidjni_MainActivity_DEFAULT_KEYS_DIALER
#define com_example_myandroidjni_MainActivity_DEFAULT_KEYS_DIALER 1L
#undef com_example_myandroidjni_MainActivity_DEFAULT_KEYS_SHORTCUT
#define com_example_myandroidjni_MainActivity_DEFAULT_KEYS_SHORTCUT 2L
#undef com_example_myandroidjni_MainActivity_DEFAULT_KEYS_SEARCH_LOCAL
#define com_example_myandroidjni_MainActivity_DEFAULT_KEYS_SEARCH_LOCAL 3L
#undef com_example_myandroidjni_MainActivity_DEFAULT_KEYS_SEARCH_GLOBAL
#define com_example_myandroidjni_MainActivity_DEFAULT_KEYS_SEARCH_GLOBAL 4L
/*
 * Class:     com_example_myandroidjni_MainActivity
 * Method:    stringformJNI
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_example_myandroidjni_MainActivity_stringformJNI
  (JNIEnv *, jobject);

/*
 * Class:     com_example_myandroidjni_MainActivity
 * Method:    getImie
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_example_myandroidjni_MainActivity_getImie
  (JNIEnv *, jobject);


#ifdef __cplusplus
}
#endif
#endif

装载so文件:

 static{
  System.loadLibrary("myandroidjnindk");
 } 

   

在active的布局文件加上以下几个控件:

    <TextView
        android:id="@+id/tv1"
        android:layout_width="match_parent"
        android:layout_height="50dip"
        android:text="@string/hello_world" />

    <Button 
        android:id="@+id/btn1"
        android:layout_below="@id/tv1"
        android:layout_width="match_parent"
        android:layout_height="50dip"
        android:text="btn1"
        />
    
    <Button 
        android:id="@+id/btn2"
        android:layout_below="@id/btn1"
        android:layout_width="match_parent"
        android:layout_height="50dip"
        android:text="btn2"
        />
    
     <Button 
        android:id="@+id/btn3"
        android:layout_below="@id/btn2"
        android:layout_width="match_parent"
        android:layout_height="50dip"
        android:text="btn3"
        />
     
     <Button 
        android:id="@+id/btn4"
        android:layout_below="@id/btn3"
        android:layout_width="match_parent"
        android:layout_height="50dip"
        android:text="btn4"
        />


在MainActivity定义以下几个变量:

 private Button btn1=null;
 private Button btn2=null;
 private Button btn3=null;
 private Button btn4=null;
 private TextView tv1=null;


在 onCreate的后面填写以下代码:

		btn1=(Button)findViewById(R.id.btn1);
		btn2=(Button)findViewById(R.id.btn2);
		btn3=(Button)findViewById(R.id.btn3);
		btn4=(Button)findViewById(R.id.btn4);
		tv1=(TextView)findViewById(R.id.tv1);
		
		btn1.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				tv1.setText(stringformJNI());
				
			}
		});
		
		btn2.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				tv1.setText(getImie());
				
			}
		});
		
		btn4.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				finish();
				
			}
		});


     保存编译运行。发现app无法启动。报加载so文件失败。在JNI文件夹下加入Application.mk这个文件。内容为 APP_ABI := all

在编译运行。此时app能够正常运行。TextView里显示的内容正常。




你可能感兴趣的:(Windows下NDK环境搭建)