一、配置好的ADT。
二、点击菜单Window——Preferences——Android——NDK,输入NDK的路径,最好无中文字符。
三、新建一个Android项目HelloADT。右键项目名,点击Properties——C/C++ General——Paths and Symbols
,在Includes标签点击Add,输入NDK中include地址,如D:\AndroidNdk\platforms\android-19\arch-arm\usr\include并勾选Add to all languages。
示例:
在上述的HelloADT项目中新建一个Class—GetString
package com.zhang.helloadt;
public class GetString {
public static native String getString(); //类方法
public native String getStr(); //实例方法
public native int add(int a, int b);//带参实例
static{
System.loadLibrary("HelloADT");
}
}
右键项目名称,点击Android Tools——Add Native Support,填入HelloADT,finish。
使用cmd— javah -jni 命令生成GetString的头文件,将其放入项目jni目录下
生成的头文件如下
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_zhang_helloadt_GetString */
#ifndef _Included_com_zhang_helloadt_GetString
#define _Included_com_zhang_helloadt_GetString
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_zhang_helloadt_GetString
* Method: getString
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_zhang_helloadt_GetString_getString
(JNIEnv *, jclass);
/*
* Class: com_zhang_helloadt_GetString
* Method: getStr
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_zhang_helloadt_GetString_getStr
(JNIEnv *, jobject);
/*
* Class: com_zhang_helloadt_GetString
* Method: add
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_com_zhang_helloadt_GetString_add
(JNIEnv *, jobject, jint, jint);
#ifdef __cplusplus
}
#endif
#endif
#include <jni.h>
#include "com_zhang_helloadt_GetString.h"
JNIEXPORT jstring JNICALL Java_com_zhang_helloadt_GetString_getString(
JNIEnv *env, jclass) {
return env->NewStringUTF("Static Method Call");
}
JNIEXPORT jstring JNICALL Java_com_zhang_helloadt_GetString_getStr(JNIEnv *env,
jobject) {
return env->NewStringUTF("Method Call");
}
JNIEXPORT jint JNICALL Java_com_zhang_helloadt_GetString_add(JNIEnv *env,
jobject, jint a, jint b) {
return a + b;
}
在MainActivity中
package com.zhang.helloadt;
import android.app.Activity;
import android.os.Bundle;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
System.out.println(GetString.getString());
GetString g = new GetString();
System.out.println(g.getStr());
GetString s = new GetString();
System.out.println(s.add(1, 2));
}
}
运行程序在armeabi架构的虚拟机中
若想在x86的架构中运行,只需在jni文件夹创建Application.mk文件,输入 APP_ABI := x86 armeabi 即可。
头文件的生成也可使用ADT自带的Ant实现
可先在工程传建一个xml文件如:build_headers,使用Ant打开。
编写方法具体参照网址 点击打开链接 http://www.codeweblog.com/android-ant-ndk构建自动生成c-c-头文件/
<?xml version="1.0" encoding="UTF-8"?>
<!-- ======================================================================
2016年8月10日 下午11:38:34
HelloADT
description
Administrator
====================================================================== -->
<project name="HelloADT" default="BuildAllHeaders">
<description>
description
</description>
<!-- =================================
target: BuildAllHeaders
================================= -->
<target name="BuildAllHeaders">
<antcall target ="BuildGetStringHeader" ></antcall>
<span style="white-space:pre"> </span><antcall target ="BuildGetIntHeader" ></antcall>
</target>
<!-- - - - - - - - - - - - - - - - - -
target: BuildGetStringHeader
<javah destdir="./jni" classpath="./bin/classes/" class="com.zhang.helloadt.GetString"></javah>
- - - - - - - - - - - - - - - - - -->
<target name="BuildGetStringHeader">
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span><exec dir="${basedir}/bin/classes/" executable="javah">
<span style="white-space:pre"> </span><arg value="-d"/>
<span style="white-space:pre"> </span><arg value="${basedir}/jni/"/>
<span style="white-space:pre"> </span><arg value="-jni"/>
<span style="white-space:pre"> </span><arg value="com.zhang.helloadt.GetString"/>
<span style="white-space:pre"> </span></exec>
<span style="white-space:pre"> </span>
</target>
<span style="white-space:pre"> </span><!-- - - - - - - - - - - - - - - - - -
target: BuildGetIntHeader
- - - - - - - - - - - - - - - - - -->
<target name="BuildGetIntHeader">
<span style="white-space:pre"> </span><exec dir="${basedir}/bin/classes/" executable="javah">
<span style="white-space:pre"> </span> <span style="white-space:pre"> </span><arg value="-d"/>
<span style="white-space:pre"> </span> <span style="white-space:pre"> </span><arg value="${basedir}/jni/"/>
<span style="white-space:pre"> </span> <span style="white-space:pre"> </span><arg value="-jni"/>
<span style="white-space:pre"> </span> <span style="white-space:pre"> </span><arg value="com.zhang.helloadt.GetInt"/>
<span style="white-space:pre"> </span> <span style="white-space:pre"> </span></exec>
</target>
</project>
编译多个源文件
如在jni中再创建一个C++文件Hello.h和Hello.cpp
#ifndef HELLO_H_
#define HELLO_H_
class Hello {
public:
Hello();
char * getWords();
virtual ~Hello();
};
#endif /* HELLO_H_ */
#include "Hello.h"
Hello::Hello() {
// TODO Auto-generated constructor stub
}
char* Hello::getWords(){
return "Hello NDK";
}
Hello::~Hello() {
// TODO Auto-generated destructor stub
}
在GetString.java中加入
public static native String getWords();
再用Ant重新生成头文件,在HelloADT.cpp中实现
JNIEXPORT jstring JNICALL Java_com_zhang_helloadt_GetString_getWords
(JNIEnv *env, jclass){
Hello h;
return env->NewStringUTF((const char*)h.getWords());
}