AS下NDK开发(一),as下ndk开发
捣鼓了一天的NDK,总结下。
Eclipse下开发ndk好像挺麻烦的样子,看书上要下载Cygwin,eclipse还要下载插件CDT。。而在AS上就方便多啦。下载android ndk。安装,配置环境,即可。
NDK(android native develop kits ):android 本地开发工具集 ,这些工具帮助开发者快速开发C或C++动态库,并自动将so和java文件打包成apk,可以把c/c++ ->编译成一个 linux下可以执行的二进制文件 java代码里面就可以通过jni 调用执行二进制的文件.
JNI :java本地开发接口,JNI是一个协议这个协议用来沟通java代码和外部的本地代码(c/c++).通过这个协议,java代码就可以调用外部的c/c++,代码外部的c/c++代码也可以调用java代码。
JNI开发用途:Native code效率高,数学运算,实时渲染的游戏上,音视频处理(极品飞车,opengl,ffmpeg等。
一、配置NDK环境
下载NDK,网上有很多,下载好之后,解压即可。然后在AS中配置,依次点击:File ->ProjectStructure:如图:
配置好之后,会在项目下的local.properties文件里自动添加:ndk.dir=D\:\\android-ndk-r10d 如果没有就自己加上,我的是自动的。
二、建立app项目
1.建立一个普通的android project
2.声明原生方法,必须加上native,告诉程序这是一个原生方法。在具体java代码调用时,和调用java的其他方法一样,直接调用就可以了。activity代码:
import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.Toast; public class NDK extends Activity { static { System.loadLibrary("MyJni");//导入生成的链接库文件 } public native String getStringFromNative();//本地方法 public native String getString_From_c(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_ndk); } public void onClick(View view) { System.out.println(getString_From_c()); Toast.makeText(this, getStringFromNative(), Toast.LENGTH_LONG).show(); } }
System.loadLibrary("MyJni");加载库,需要注意的是加载的库名即编译生成的库名,去掉前缀lib和后缀so。
然后make project一下,目的就是编译成对应的class文件。然后根据生成的class文件,利用javah生成对应的 .h头文件。
三、生成.h头文件
1.AS中点击view ->ToolsWindows->Terminal,
cd app\src\main,进入src\main\目录下:
2.执行:
javah -d jni -classpath F:\android\sdk\platforms\android-23\android.jar;..\..\build\intermediates\classes\debug example.user.ndkdemo2.NDK
这个命令很长,分开慢慢来,javah是生成头文件需要的工具,-d jni 在工程下生成jni目录,到时会在这个目录下建JNI开始的C/C++源文件的。
-classpath F:\android\sdk\platforms\android-23\android.jar 这个就是你SDK文件下android.jar所在的文件位置,找到后复制即可。
..\..\build\intermediates\classes\debug 这个路径如图所示:
example.user.ndkdemo2.NDK就是NDKclass的路径名。
执行完这个命令后,会在main文件夹下自动生成jni目录和.h头文件。
可以打头文件看看:
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class example_user_ndkdemo2_NDK */ #ifndef _Included_example_user_ndkdemo2_NDK #define _Included_example_user_ndkdemo2_NDK #ifdef __cplusplus extern "C" { #endif #undef example_user_ndkdemo2_NDK_BIND_ABOVE_CLIENT #define example_user_ndkdemo2_NDK_BIND_ABOVE_CLIENT 8L #undef example_user_ndkdemo2_NDK_BIND_ADJUST_WITH_ACTIVITY #define example_user_ndkdemo2_NDK_BIND_ADJUST_WITH_ACTIVITY 128L #undef example_user_ndkdemo2_NDK_BIND_ALLOW_OOM_MANAGEMENT #define example_user_ndkdemo2_NDK_BIND_ALLOW_OOM_MANAGEMENT 16L #undef example_user_ndkdemo2_NDK_BIND_AUTO_CREATE #define example_user_ndkdemo2_NDK_BIND_AUTO_CREATE 1L #undef example_user_ndkdemo2_NDK_BIND_DEBUG_UNBIND #define example_user_ndkdemo2_NDK_BIND_DEBUG_UNBIND 2L #undef example_user_ndkdemo2_NDK_BIND_IMPORTANT #define example_user_ndkdemo2_NDK_BIND_IMPORTANT 64L #undef example_user_ndkdemo2_NDK_BIND_NOT_FOREGROUND #define example_user_ndkdemo2_NDK_BIND_NOT_FOREGROUND 4L #undef example_user_ndkdemo2_NDK_BIND_WAIVE_PRIORITY #define example_user_ndkdemo2_NDK_BIND_WAIVE_PRIORITY 32L #undef example_user_ndkdemo2_NDK_CONTEXT_IGNORE_SECURITY #define example_user_ndkdemo2_NDK_CONTEXT_IGNORE_SECURITY 2L #undef example_user_ndkdemo2_NDK_CONTEXT_INCLUDE_CODE #define example_user_ndkdemo2_NDK_CONTEXT_INCLUDE_CODE 1L #undef example_user_ndkdemo2_NDK_CONTEXT_RESTRICTED #define example_user_ndkdemo2_NDK_CONTEXT_RESTRICTED 4L #undef example_user_ndkdemo2_NDK_MODE_APPEND #define example_user_ndkdemo2_NDK_MODE_APPEND 32768L #undef example_user_ndkdemo2_NDK_MODE_ENABLE_WRITE_AHEAD_LOGGING #define example_user_ndkdemo2_NDK_MODE_ENABLE_WRITE_AHEAD_LOGGING 8L #undef example_user_ndkdemo2_NDK_MODE_MULTI_PROCESS #define example_user_ndkdemo2_NDK_MODE_MULTI_PROCESS 4L #undef example_user_ndkdemo2_NDK_MODE_PRIVATE #define example_user_ndkdemo2_NDK_MODE_PRIVATE 0L #undef example_user_ndkdemo2_NDK_MODE_WORLD_READABLE #define example_user_ndkdemo2_NDK_MODE_WORLD_READABLE 1L #undef example_user_ndkdemo2_NDK_MODE_WORLD_WRITEABLE #define example_user_ndkdemo2_NDK_MODE_WORLD_WRITEABLE 2L #undef example_user_ndkdemo2_NDK_DEFAULT_KEYS_DIALER #define example_user_ndkdemo2_NDK_DEFAULT_KEYS_DIALER 1L #undef example_user_ndkdemo2_NDK_DEFAULT_KEYS_DISABLE #define example_user_ndkdemo2_NDK_DEFAULT_KEYS_DISABLE 0L #undef example_user_ndkdemo2_NDK_DEFAULT_KEYS_SEARCH_GLOBAL #define example_user_ndkdemo2_NDK_DEFAULT_KEYS_SEARCH_GLOBAL 4L #undef example_user_ndkdemo2_NDK_DEFAULT_KEYS_SEARCH_LOCAL #define example_user_ndkdemo2_NDK_DEFAULT_KEYS_SEARCH_LOCAL 3L #undef example_user_ndkdemo2_NDK_DEFAULT_KEYS_SHORTCUT #define example_user_ndkdemo2_NDK_DEFAULT_KEYS_SHORTCUT 2L #undef example_user_ndkdemo2_NDK_RESULT_CANCELED #define example_user_ndkdemo2_NDK_RESULT_CANCELED 0L #undef example_user_ndkdemo2_NDK_RESULT_FIRST_USER #define example_user_ndkdemo2_NDK_RESULT_FIRST_USER 1L #undef example_user_ndkdemo2_NDK_RESULT_OK #define example_user_ndkdemo2_NDK_RESULT_OK -1L #undef example_user_ndkdemo2_NDK_MAX_NUM_PENDING_FRAGMENT_ACTIVITY_RESULTS #define example_user_ndkdemo2_NDK_MAX_NUM_PENDING_FRAGMENT_ACTIVITY_RESULTS 65534L #undef example_user_ndkdemo2_NDK_HONEYCOMB #define example_user_ndkdemo2_NDK_HONEYCOMB 11L #undef example_user_ndkdemo2_NDK_MSG_REALLY_STOPPED #define example_user_ndkdemo2_NDK_MSG_REALLY_STOPPED 1L #undef example_user_ndkdemo2_NDK_MSG_RESUME_PENDING #define example_user_ndkdemo2_NDK_MSG_RESUME_PENDING 2L /* * Class: example_user_ndkdemo2_NDK * Method: getStringFromNative * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_example_user