EclipseADT配置NDK

来源:互联网 发布:英文软件翻译工具 编辑:程序博客网 时间:2024/06/03 14:01


一、配置好的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 __cplusplusextern "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 {@Overrideprotected 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



0 0