通过NDK开发,可以使用C++编写代码,生成so文件,然后通过Android应用的Java代码调用接口使用C++里面的函数。
一、首先下载ADT和NDK
下载地址:
ADT:http://developer.android.com/sdk/installing/installing-adt.html
NDK:http://developer.android.com/ndk/downloads/index.html#download
然后配置好NDK的路径:
二、新建一个Android Project,并添加本地代码支持
添加完后会在工程目录下新生成一个jni文件夹
三、在Android Projecty下面新建一个NativeClass.java,编写如下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 | package com.monkey.testndk; import android.util.Log; public class NativeClass { public static native boolean jniArrayAdd(int[] a,int b); static{ Log.i("NativeClass", "before load library"); System.loadLibrary("TestNDK"); Log.i("NativeClass", "after load library"); } } |
四、接下来就要给刚刚新建的类,生成头文件了,在Eclipse中配置外部工具。
点击Progam新建一个,配置好执行的javah命令。
上面location的地址记得改成本机javah.exe的路径,确定即可。然后点击Origanize Favorites..,把刚刚新建的javah加进来。
点击javah,然后在jni目录下按F5,就能看到新建出来的头文件了。(记得先选中要生成的源文件目录)
五、编写MainActivity代码如下:
1 2 3 4 5 6 7 8 | TextView tv = new TextView(this); int[] array = new int[]{1,2,3}; String str = "调用C++前:"+Arrays.toString(array)+"\n"; boolean isCopyofArrayInCpp = NativeClass.jniArrayAdd(array, 5); str += "在C++中为副本? "+isCopyofArrayInCpp+"\n"; str += "调用C++后:"+Arrays.toString(array); tv.setText(str); setContentView(tv); |
六、编写C++代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 | JNIEXPORT jboolean JNICALL Java_com_monkey_testndk_NativeClass_jniArrayAdd( JNIEnv* env,jclass,jintArray array,jint b ){ jsize size = env->GetArrayLength(array); jboolean isCopy; jint* pArray = (jint*)env->GetPrimitiveArrayCritical(array,&isCopy); for(int i = 0; i < size; i++) pArray[i] += b; env->ReleasePrimitiveArrayCritical(array,pArray,JNI_COMMIT); return isCopy; } |
七、在jni目录下新建文件Application.mk,添加需要生成的目标平台架构,如下:
APP_ABI := armeabi armeabi-v7a x86
八、编译后就能看到不同平台生成了不同的so文件。
九,最后运行就能看到结果显示: