之前写了一篇JNI的使用,这里其实也是JNI的使用,只不过现在的使用更加方便,不需要什么cygwin或者gnu去创建那边麻烦,直接eclipse完成所有操作。
先前的一篇:http://xuzhiwei.blog.51cto.com/978424/976839
1、首先现在Android的SDK和NDK
![QQ图片20140619134405.jpg wKioL1OiefrhCR4FAACBUy4ndXI621.jpg]()
2、sdk中以及集成了eclipse,打开eclipse并下载CDT插件支持,一会儿写c++使用。
CDT下载地址:http://www.eclipse.org/cdt/
3、配置NDK环境,windows->preferences->Android->NDK进行配置。
![2.jpg wKioL1OietPwXfUXAAIctFw-BEs361.jpg]()
4、创建项目
![3.jpg wKioL1OieyrhEMdGAAKr_JahOqI251.jpg]()
5、创建完成后,右击项目Android Tools->Add Native Support就可以了。![4.jpg wKiom1OifBCwAzCyAADVLH372i8435.jpg]()
![5.jpg wKiom1OifPKw4a5FAAD38R0Tkd0164.jpg]()
自动为我们生成了JNI的目录,以及编译的Android.mk等文件。
![6.jpg wKioL1OifMTAbDwsAADxiR32eA4998.jpg]()
6、好了,开始写代码。
创建NativeUtils.java
|
1
2
3
4
5
6
7
8
9
|
package
com.xzw.firstndk;
/**
* 与c++的接口类,用来生成.h头文件
* @author xzw
*
*/
public
class
NativeUtils {
public
static
native
String getWords();
}
|
现在要生成.h的头文件,之前是在cmd里面通过javah命令来生成的,这里我们使用ant来自动为我们生成头文件。
创建build_headers.xml然后以ant editor的方式打开,使用快捷键ALT+/生成模板。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
<?
xml
version
=
"1.0"
encoding
=
"UTF-8"
?>
<
project
name
=
"FirstNDK"
default
=
"BuilderHeaders"
>
<
description
>
description
</
description
>
<
target
name
=
"BuilderHeaders"
depends
=
"BuildNativeHeader"
/>
<
target
name
=
"BuildNativeHeader"
>
<
javah
destdir
=
"./jni"
classpath
=
"bin/classes"
class
=
"com.xzw.firstndk.NativeUtils"
></
javah
>
</
target
>
</
project
>
|
右击运行ant,然后刷新jni目录就可以看到.h文件了,也把一些依赖库给我们创建好了,方便很多。
如图
![7.jpg wKioL1OigSbi2Sv1AAFMqyN52e0911.jpg]()
打开com_xzw_firstndk_NativeUtils.h可以看到:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
#include <jni.h>
#ifndef _Included_com_xzw_firstndk_NativeUtils
#define _Included_com_xzw_firstndk_NativeUtils
#ifdef __cplusplus
extern
"C"
{
#endif
JNIEXPORT jstring JNICALL Java_com_xzw_firstndk_NativeUtils_getWords
(JNIEnv *, jclass);
#ifdef __cplusplus
}
#endif
#endif
|
现在开始实现,打开FirstNDK.cpp,引入.h头文件
![8.jpg wKioL1OiggvRaNqkAAJrQGLtjE8254.jpg]()
eclipse提示功能也是很不错的,alt+/快捷快速提示,
|
1
2
3
4
5
6
7
8
9
10
11
12
|
#include <jni.h>
#include "com_xzw_firstndk_NativeUtils.h"
JNIEXPORT jstring JNICALL Java_com_xzw_firstndk_NativeUtils_getWords
(JNIEnv *env, jclass clazz){
return
env->NewStringUTF(
"hello firt ndk"
);
}
|
好了,c++部分ok了,现在来调用咯。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
package
com.xzw.firstndk;
import
android.app.Activity;
import
android.os.Bundle;
import
android.widget.TextView;
public
class
MainActivity
extends
Activity {
TextView resultText;
@Override
protected
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
resultText = (TextView)findViewById(R.id.result);
resultText.setText(NativeUtils.getWords());
}
static
{
System.loadLibrary(
"FirstNDK"
);
}
}
|
完成了,默认生成的是armeabi架构的so文件,如果需要生成多中架构的支持的so,需要在jni目录下创建Application.mk文件。
|
1
|
APP_ABI :=armeabi armeabi-v7a x86
|
添加好了,运行起来就可以在libs目录下看到这几个架构的文件夹了。搞定手工了。
本文转自xuzw13 51CTO博客,原文链接:http://blog.51cto.com/xuzhiwei/1428192,如需转载请自行联系原作者