开发了两年安卓,NDK始终是绕不过的弯。还是需要搞下啊。本文大概分为4个部分。
1.环境搭建
我采用的是eclipse 搭建环境, 网上一搜一大堆,但是有些比较蒙人,ndk r8 r9 其实不要 Cygwin ,谁要说需要这个玩意,就是坑人啊!
废话不说,首先搞个ndk tools ,然后下载ndk 。
具体详见:
2. 开发
开发的时候,需要在右键,---》Android Tools --》添加natvie 依赖,然后你就得到了 ndk 的工作目录。
注意点如下:
2.1 Android.mk 配置
.mk 这个玩意是Linux编译的脚本,具体怎么配置以后再学习,这里只需要知道怎么编译出来一个.so 文件即可.
2.2 关于命名规则
这简直是一个大坑,真坑人,函数的命名采用的是 包名+类名+方法
2.3 关于so文件
自动生成的.so 文件,lib+example+.so
在加载库文件的时候,只需要 写example 就好。
代码如下:
public native String stringFromJNI(); public native int plus(int x,int y); static { System.loadLibrary("NdkTest"); }
extern "C" { jstring Java_com_example_ndktest_MainActivity_stringFromJNI( JNIEnv* env,jobject thiz); jint Java_com_example_ndktest_MainActivity_plus(JNIEnv* env,jobject thiz,jint x,jint y); }; jint Java_com_example_ndktest_MainActivity_plus(JNIEnv* env, jobject thiz,jint x,jint y){ return x+y; } jstring Java_com_example_ndktest_MainActivity_stringFromJNI( JNIEnv* env, jobject thiz ) { \#if defined(__arm__) #if defined(__ARM_ARCH_7A__) #if defined(__ARM_NEON__) #if defined(__ARM_PCS_VFP) #define ABI "armeabi-v7a/NEON (hard-float)" #else #define ABI "armeabi-v7a/NEON" #endif #else #if defined(__ARM_PCS_VFP) #define ABI "armeabi-v7a (hard-float)" #else #define ABI "armeabi-v7a" #endif #endif #else #define ABI "armeabi" #endif \#elif defined(__i386__) #define ABI "x86" \#elif defined(__x86_64__) #define ABI "x86_64" \#elif defined(__mips64) /* mips64el-* toolchain defines __mips__ too */ #define ABI "mips64" \#elif defined(__mips__) #define ABI "mips" \#elif defined(__aarch64__) #define ABI "arm64-v8a" \#else #define ABI "unknown" \#endif const char* c = "hello how are you i am ahmad raza"; jstring s = env->NewStringUTF(c); return s; }
3结果如图:
4.参考如下:
http://wear.techbrood.com/tools/sdk/ndk/
http://developer.android.com/ndk/samples/sample_hellojni.html
https://github.com/googlesamples/android-ndk
ps
那些个,自己没有运行起来却写博客的人,真是一个坑!!!!!!!!!!!!!!
代码下载地址