android ndk 入门

首先,在eclipse里面创建一个androidproject,设定包名(com.test)。

然后创建一个java文件,例如命名为testMine,在其中声明native的方法,如下:

package com.test;

public class testMine {

    public staticnative long calculate(int n);

}

然后编译该项目。

在命令窗口中,进入该项目所在文件夹, 执行命令

javah -classpath bin/classes -jni -d jni  com.test.testMine

注意, classpath要指向classes文件所在。这样,就在jni文件夹中生成了一个头文件com_test_testMine.h, 这个是自动生成的文件,内容如下。如果需要新版本的该文件,可以通过javah命令再次生成。

扫描二维码关注公众号,回复: 3067485 查看本文章

/* DO NOT EDIT THISFILE - it is machine generated */

#include <jni.h>

/* Header for classcom_test_testMine */

#ifndef_Included_com_test_testMine

#define_Included_com_test_testMine

#ifdef __cplusplus

extern "C" {

#endif

/*

 * Class:    com_test_testMine

 * Method:   calculate

 * Signature: (I)J

 */

JNIEXPORT jlongJNICALL Java_com_test_testMine_calculate

  (JNIEnv *, jclass, jint);

#ifdef __cplusplus

}

#endif

#endif

接下来要做的就是实现Java_com_test_testMine_calculate方法。

建立对应这个header的文件com_test_testMine.c

#include"com_test_testMine.h"

jlong JNICALLJava_com_test_testMine_calculate(JNIEnv * jnienv, jclass clas,

                                jint n) {

                return n + 1;

}

然后在该目录下创建一个Android make 文件,Android.mk

LOCAL_PATH := $(callmy-dir)

include $(CLEAR_VARS)

LOCAL_MODULE :=testMine

LOCAL_SRC_FILES :=com_test_testMine.c

include$(BUILD_SHARED_LIBRARY)

一般情况下基本格式默认,除了LOCAL_MODULE和LOCAL_SRC_FILES要根据命名进行更改。

接下来就该对它进行编译了,如果还没有下载NDK的必须要下载, <ndk>指向该目录所在地。

进入到该项目的根目录,即jni文件的上层目录,然后执行

<ndk>/ndk-build

这样就把testMine生成so文件,同时它还给安装到project/libs下了

Compile thumb  : testMine <= com_test_testMine.c

SharedLibrary  : libtestMine.so

Install        : libtestMine.so =>libs/armeabi/libtestMine.so

修改一开始生成的testMine.java文件,增加loadLibrary调用,从而在一开始就载入该library。

package com.test;

public class testMine{

    static {

       System.loadLibrary("testMine");

    }

    public static native long calculate(int n);

}

这下就可以调用该calculate 方法了, 一个简单的例子是另外创建一个Activity进行调用,如下例中showResult.java

package com.test;

importandroid.app.Activity;

importandroid.os.Bundle;

importandroid.widget.Toast;

public classshowResult extends Activity {

    @Override

    protected void onCreate(BundlesavedInstanceState) {

        // TODO Auto-generated method stub

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        long result = testMine.calculate(100);

        Toast.makeText(getApplicationContext(),"result="+result, Toast.LENGTH_LONG).show();

    }

}

当然需要对该项目的AndroidManifest.xml进行更新,加入该Activity的信息

<?xmlversion="1.0" encoding="utf-8"?>

<manifestxmlns:android="http://schemas.android.com/apk/res/android"

    package="com.test"

    android:versionCode="1"

    android:versionName="1.0" >

    <uses-sdkandroid:minSdkVersion="10" />

    <application

       android:icon="@drawable/ic_launcher"

       android:label="@string/app_name" >

           <activity

           android:label="@string/app_name"

           android:name=".showResult" >

            <intent-filter >

                <actionandroid:name="android.intent.action.MAIN" />

                <categoryandroid:name="android.intent.category.LAUNCHER" />

            </intent-filter>

        </activity>

    </application>

</manifest>

编译运行,然后就可以看到一个提示框显示结果101.

一个简单的android ndk实例就此告成。


猜你喜欢

转载自blog.csdn.net/flywalker/article/details/7664636