[Android]NDK开发环境配置与JNI开发
2016-05-17 18:17
676 查看
本文的目标是实现NDK开发环境的配置以及学习JNI开发流程。
2.1从链接:http://dl.google.com/android/repository/android-ndk-r11c-windows-x86_64.zip下载NDK开发包,然后解压到本地路径,并拷贝本路径(比如我的是:D:\android-sdk\android-ndk-r11c-windows-x86_64\android-ndk-r11c)。
2.2配置系统的环境变量,操作路径为:高级系统设置–>环境变量–>找到PATH–>新建即可,如下图所示:
2.3为Eclipse添加NDK路径,操作路径为:Windows–>Preference–>NDK,如下图所示:
2.4为Eclipse安装CDT插件添加c/c++环境支持,安装连接:cdt - http://download.eclipse.org/tools/cdt/releases/8.8.1。操作路径为:help–>Install New Software,如下图所示:
3.2在string.pub.jni.test包下新建TestJni.java类,添加如下代码:
3.3将上一步创建的类文件拷贝到bin目录下,然后从命令行界面cd到..\AJniDemo\bin目录下运行javac TestJni.java,完成后可以看到在bin目录下生成的TestJni.class文件了。之后在..\bin目录下按照包名的顺序新建文件夹,路径为..\bin\string\pub\jni\test,将TestJni.class拷贝到..\bin\string\pub\jni\test目录下,在命令行界面执行javah -jni string.pub.jni.test.TestJni可以看到在..\bin目录下生成了string_pub_jni_test_TestJni.h这个头文件。将生成的头文件拷贝到项目的jni目录下,如下图所示:
3.4上一步生成了所需要的头文件,这一步开始实现c++层的代码了。按照上一步新建图中的文件,然后右键项目–>Android Tools–>Add Native Support。所需要的代码如下:
3.5命令行界面下,在项目根目录下执行:ndk-build,成功之后刷新项目,就可以看到在Libs下面生成了.so文件。如下图所示:
4.2在TestJni.java中添加如下代码:
4.3在其他地方调用JNI方法,如下所示:
以上,就是一个简单的JNI开发实例。
1.环境配置
本文的开发环境为win10 64位+Eclipse+Android ADT+NDK+CDT。2.安装:
这里只介绍NDK和CDT的安装。2.1从链接:http://dl.google.com/android/repository/android-ndk-r11c-windows-x86_64.zip下载NDK开发包,然后解压到本地路径,并拷贝本路径(比如我的是:D:\android-sdk\android-ndk-r11c-windows-x86_64\android-ndk-r11c)。
2.2配置系统的环境变量,操作路径为:高级系统设置–>环境变量–>找到PATH–>新建即可,如下图所示:
2.3为Eclipse添加NDK路径,操作路径为:Windows–>Preference–>NDK,如下图所示:
2.4为Eclipse安装CDT插件添加c/c++环境支持,安装连接:cdt - http://download.eclipse.org/tools/cdt/releases/8.8.1。操作路径为:help–>Install New Software,如下图所示:
3.完成了第二步,接下来进行代码编写
3.1新建一个安卓项目,并在项目的根目录下新建jni文件夹,如下图所示:3.2在string.pub.jni.test包下新建TestJni.java类,添加如下代码:
package string.pub.jni.test; public class TestJni { public native boolean init(); public native int add(int x , int y); public native void destory(); }
3.3将上一步创建的类文件拷贝到bin目录下,然后从命令行界面cd到..\AJniDemo\bin目录下运行javac TestJni.java,完成后可以看到在bin目录下生成的TestJni.class文件了。之后在..\bin目录下按照包名的顺序新建文件夹,路径为..\bin\string\pub\jni\test,将TestJni.class拷贝到..\bin\string\pub\jni\test目录下,在命令行界面执行javah -jni string.pub.jni.test.TestJni可以看到在..\bin目录下生成了string_pub_jni_test_TestJni.h这个头文件。将生成的头文件拷贝到项目的jni目录下,如下图所示:
3.4上一步生成了所需要的头文件,这一步开始实现c++层的代码了。按照上一步新建图中的文件,然后右键项目–>Android Tools–>Add Native Support。所需要的代码如下:
//Android.mk LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := TestJNI LOCAL_SRC_FILES := string_pub_jni_test_TestJni.cpp LOCAL_SRC_FILES += CAdd.cpp include $(BUILD_SHARED_LIBRARY)
//Application.mk APP_PROJECT_PATH := ${call my-dir} APP_BUILD_SCRIPT=$(APP_PROJECT_PATH)/Android.mk APP_MODULES := TestJNI APP_ABI := armeabi armeabi-v7a x86
//CAdd.cpp #include "CAdd.h" CAdd::CAdd(){ } CAdd::~CAdd(){ } int CAdd::add(int x, int y){ return x+y; }
//CAdd.h #ifndef JNI_TEST_ADD #define JNI_TEST_ADD class CAdd{ public: CAdd(); ~CAdd(); int add(int x, int y); }; #endif
//string_pub_jni_test_TestJni.cpp #include <stdlib.h> #include <stdio.h> #include "CAdd.h" #include "jni.h" CAdd *pCAdd = NULL; extern "C" { JNIEXPORT jboolean JNICALL Java_string_pub_jni_test_TestJni_init (JNIEnv *env, jobject obj){ if(pCAdd==NULL){ pCAdd = new CAdd ; } return pCAdd!=NULL; } JNIEXPORT jint JNICALL Java_string_pub_jni_test_TestJni_add (JNIEnv *env, jobject obj, jint x, jint y){ jint res = -1; if(pCAdd==NULL){ pCAdd = new CAdd ; res = pCAdd->add(x,y); }else{ res = pCAdd->add(x,y); } return res; } JNIEXPORT void JNICALL Java_string_pub_jni_test_TestJni_destory (JNIEnv * env, jobject obj){ if(pCAdd!=NULL){ delete pCAdd; pCAdd=NULL; } } }
3.5命令行界面下,在项目根目录下执行:ndk-build,成功之后刷新项目,就可以看到在Libs下面生成了.so文件。如下图所示:
4.调用JNI方法:
4.1将3中生成的.so文件拷贝到别的项目的libs文件夹下,然后新建下图所示的包和类:4.2在TestJni.java中添加如下代码:
package string.pub.jni.test; public class TestJni { public native boolean init(); public native int add(int x , int y); public native void destory(); }
4.3在其他地方调用JNI方法,如下所示:
import string.pub.jni.test.TestJni; public class MainActivity extends Activity { static{ System.loadLibrary("TestJNI"); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TestJni test=new TestJni(); int ii=test.add(22, 2); Toast.makeText(getApplicationContext(), ""+ii, Toast.LENGTH_SHORT).show(); }
以上,就是一个简单的JNI开发实例。
相关文章推荐
- Android Studio使用Lambda表达式出错
- android调用webservice解析Gson数据
- [存储]Android使用SQLiteOpenHelper简单存储
- Android应用程序安装过程源代码分析
- android 下拉刷新控件SwipeRefreshLayout简单使用
- Android帧动画(WiFi动画)
- Android学习笔记十六:Android listview与adapter用法
- Android 内存泄漏总结
- 优化Android Studio/Gradle构建
- 拖动Layout时,出现向上滑动
- Android问题解决之使用字符串&对象空值判断
- 【Bugly干货分享】手把手教你逆向分析 Android 程序
- Android Drawable Resources系列1:Bitmap(dither图像抖动、tileMode平铺模式)
- Android之Adapter用法总结
- Android开源项目收集
- Android沉浸式状态栏的两种实现方式
- android4.2系统增永不休眠同时隐藏休眠选项
- android Event Bus解耦android模块
- android Event Bus解耦android模块
- android 流量统计