EclipseADT配置NDK
一、配置好的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
jni目录中HelloADT.cpp如下
#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()); }
注意需要在Android.mk中LOCAL_SRC_FILES添加Hello.cpp