您的位置:首页 > 其它

Windows环境下NDK环境搭建

2016-01-18 18:07 267 查看
在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

     


      新建一个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"

生成的头文件内容如下:

[cpp] view
plain copy

 





/* 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的布局文件加上以下几个控件:

[html] view
plain copy

 





<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的后面填写以下代码:

[java] view
plain copy

 





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里显示的内容正常。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: