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里显示的内容正常。
环境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里显示的内容正常。
相关文章推荐
- 关于DelayQueue的一些
- 初学颜色矩阵(修改图像的色调,饱和度,亮度)
- C++ Builder 将数据库数据导出到Excel中总结3
- iOS开发 常用插件、工具
- 设计模式前奏–封装继承
- 2016/01/18 - start and baseApi
- HDU 1869 六度分离
- 实践的意义——写给图像处理算法爱好者的建议
- POJ 3278 Catch That Cow bfs
- redis在java中的客户端连接
- Python 5.1 使用 __slots__
- SEO浴火重生-记拯救被百度严重降权的网站优化经历
- CUDA编程——Memory Coalescing
- 基本结构
- oracle 查看执行计划方法(SQL developer,sqlplus)
- Android 动画相关笔记
- IOS8解决获取位置坐标信息出错(Error Domain=kCLErrorDomain Code=0)
- Python脚本运行出现语法错误:IndentationError: unindent does not match any outer indentation level
- 机场三字代码和四字代码的资料汇编
- hdu 2089 不要62(非dp)