android studio下ndk C++开发
2015-11-07 14:21
555 查看
1、下载NDK(Native Develop Kit)交叉编译工具,解压NDK开发工具集,随便哪里都行,看你自己的习惯,但是还是要自己知道,别什么时候不知不觉删了,然后开发JNI始终不行,怎么都找不到错误,那就杯具了。
2、在 local.properties 文件中设置ndk的路径:
ndk.dir=D:\android\android-ndk-r10d
(我的nkd的解压路径:D:\android\android-ndk-r10d)
3、头文件生成:
\\\1、建一个平时一样的android工程
\\\2、在需要调用C++函数的地方声明本地方法
\\\3、make project 一下,目的是生成class文件,我的项目生成后的路径:
(a)、D:\android\project\NDKDemo\app\build\intermediates\classes\debug\com\example\administrator\ndkdemo
ndkdemo是的工程名
此步骤的目的是为了用javah命令生成本地方法的头文件(注:该头文件没多大用处,就是一会写源文件.cpp的时候方便点,直接把.h文件的内容拷贝过来,把函数体写一下就好了)
===========================================
(b)、打开android studio 的terminal:
最后一个参数MainActivity就是前边make project那步生成的.class文件。
注意:该命令是在工程文件下app\src\main下执行的,这样执行完毕后,在main文件下就生成了jni文件,里边包含生成的.h文件。
如图:
4、在jni下建立.cpp源文件main.cpp
5、gradle配置
打开build.gradle(Module:app)
在defaultConfig中添加:
此处生成的moduleName就是上边java代码中System.loadLibrary(“hello”);对应的名字
在gradle.properties中添加:
最后一点不理解的是要在jni下随便建一个.cpp文件项目才能正确编译。
编译成功后在:
D:\android\project\NDKDemo\app\build\intermediates\ndk\debug
可以看到生成.so库。Android.mk文件也在该目录下,在eclipse项目中,NDK开发需要自己配置该文件,在android studio中会自动生成,自动生成,自动生成,重要的事情说三遍。
2、在 local.properties 文件中设置ndk的路径:
ndk.dir=D:\android\android-ndk-r10d
(我的nkd的解压路径:D:\android\android-ndk-r10d)
3、头文件生成:
\\\1、建一个平时一样的android工程
\\\2、在需要调用C++函数的地方声明本地方法
public class MainActivity extends Activity { static { System.loadLibrary("hello");//加载交叉编译生成的模块,编译方法见后边 } public native String hello();//navive标示是本地方法 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView textView = (TextView)findViewById(R.id.show); textView.setText(hello()); } }
\\\3、make project 一下,目的是生成class文件,我的项目生成后的路径:
(a)、D:\android\project\NDKDemo\app\build\intermediates\classes\debug\com\example\administrator\ndkdemo
ndkdemo是的工程名
此步骤的目的是为了用javah命令生成本地方法的头文件(注:该头文件没多大用处,就是一会写源文件.cpp的时候方便点,直接把.h文件的内容拷贝过来,把函数体写一下就好了)
===========================================
(b)、打开android studio 的terminal:
javah -d jni -classpath D:\android\sdk\platforms\android-16\android.jar;D:\android\sdk\extras\android\support\v7\appcompat\libs\android-support-v7-appcompat.jar;D:\android\sdk\extras\android\support\v4\android-support-v4.jar;..\..\build\intermediates\classes\debug com.example.administrator.ndklog.MainActivity
最后一个参数MainActivity就是前边make project那步生成的.class文件。
注意:该命令是在工程文件下app\src\main下执行的,这样执行完毕后,在main文件下就生成了jni文件,里边包含生成的.h文件。
如图:
4、在jni下建立.cpp源文件main.cpp
// // Created by Administrator on 2015/11/7. // /* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class com_example_administrator_ndkdemo_MainActivity */ #ifndef _Included_com_example_administrator_ndkdemo_MainActivity #define _Included_com_example_administrator_ndkdemo_MainActivity #ifdef __cplusplus extern "C" { #endif #undef com_example_administrator_ndkdemo_MainActivity_MODE_PRIVATE #define com_example_administrator_ndkdemo_MainActivity_MODE_PRIVATE 0L #undef com_example_administrator_ndkdemo_MainActivity_MODE_WORLD_READABLE #define com_example_administrator_ndkdemo_MainActivity_MODE_WORLD_READABLE 1L #undef com_example_administrator_ndkdemo_MainActivity_MODE_WORLD_WRITEABLE #define com_example_administrator_ndkdemo_MainActivity_MODE_WORLD_WRITEABLE 2L #undef com_example_administrator_ndkdemo_MainActivity_MODE_APPEND #define com_example_administrator_ndkdemo_MainActivity_MODE_APPEND 32768L #undef com_example_administrator_ndkdemo_MainActivity_MODE_MULTI_PROCESS #define com_example_administrator_ndkdemo_MainActivity_MODE_MULTI_PROCESS 4L #undef com_example_administrator_ndkdemo_MainActivity_MODE_ENABLE_WRITE_AHEAD_LOGGING #define com_example_administrator_ndkdemo_MainActivity_MODE_ENABLE_WRITE_AHEAD_LOGGING 8L #undef com_example_administrator_ndkdemo_MainActivity_BIND_AUTO_CREATE #define com_example_administrator_ndkdemo_MainActivity_BIND_AUTO_CREATE 1L #undef com_example_administrator_ndkdemo_MainActivity_BIND_DEBUG_UNBIND #define com_example_administrator_ndkdemo_MainActivity_BIND_DEBUG_UNBIND 2L #undef com_example_administrator_ndkdemo_MainActivity_BIND_NOT_FOREGROUND #define com_example_administrator_ndkdemo_MainActivity_BIND_NOT_FOREGROUND 4L #undef com_example_administrator_ndkdemo_MainActivity_BIND_ABOVE_CLIENT #define com_example_administrator_ndkdemo_MainActivity_BIND_ABOVE_CLIENT 8L #undef com_example_administrator_ndkdemo_MainActivity_BIND_ALLOW_OOM_MANAGEMENT #define com_example_administrator_ndkdemo_MainActivity_BIND_ALLOW_OOM_MANAGEMENT 16L #undef com_example_administrator_ndkdemo_MainActivity_BIND_WAIVE_PRIORITY #define com_example_administrator_ndkdemo_MainActivity_BIND_WAIVE_PRIORITY 32L #undef com_example_administrator_ndkdemo_MainActivity_BIND_IMPORTANT #define com_example_administrator_ndkdemo_MainActivity_BIND_IMPORTANT 64L #undef com_example_administrator_ndkdemo_MainActiv 4000 ity_BIND_ADJUST_WITH_ACTIVITY #define com_example_administrator_ndkdemo_MainActivity_BIND_ADJUST_WITH_ACTIVITY 128L #undef com_example_administrator_ndkdemo_MainActivity_CONTEXT_INCLUDE_CODE #define com_example_administrator_ndkdemo_MainActivity_CONTEXT_INCLUDE_CODE 1L #undef com_example_administrator_ndkdemo_MainActivity_CONTEXT_IGNORE_SECURITY #define com_example_administrator_ndkdemo_MainActivity_CONTEXT_IGNORE_SECURITY 2L #undef com_example_administrator_ndkdemo_MainActivity_CONTEXT_RESTRICTED #define com_example_administrator_ndkdemo_MainActivity_CONTEXT_RESTRICTED 4L #undef com_example_administrator_ndkdemo_MainActivity_RESULT_CANCELED #define com_example_administrator_ndkdemo_MainActivity_RESULT_CANCELED 0L #undef com_example_administrator_ndkdemo_MainActivity_RESULT_OK #define com_example_administrator_ndkdemo_MainActivity_RESULT_OK -1L #undef com_example_administrator_ndkdemo_MainActivity_RESULT_FIRST_USER #define com_example_administrator_ndkdemo_MainActivity_RESULT_FIRST_USER 1L #undef com_example_administrator_ndkdemo_MainActivity_DEFAULT_KEYS_DISABLE #define com_example_administrator_ndkdemo_MainActivity_DEFAULT_KEYS_DISABLE 0L #undef com_example_administrator_ndkdemo_MainActivity_DEFAULT_KEYS_DIALER #define com_example_administrator_ndkdemo_MainActivity_DEFAULT_KEYS_DIALER 1L #undef com_example_administrator_ndkdemo_MainActivity_DEFAULT_KEYS_SHORTCUT #define com_example_administrator_ndkdemo_MainActivity_DEFAULT_KEYS_SHORTCUT 2L #undef com_example_administrator_ndkdemo_MainActivity_DEFAULT_KEYS_SEARCH_LOCAL #define com_example_administrator_ndkdemo_MainActivity_DEFAULT_KEYS_SEARCH_LOCAL 3L #undef com_example_administrator_ndkdemo_MainActivity_DEFAULT_KEYS_SEARCH_GLOBAL #define com_example_administrator_ndkdemo_MainActivity_DEFAULT_KEYS_SEARCH_GLOBAL 4L /* * Class: com_example_administrator_ndkdemo_MainActivity * Method: hello * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_com_example_administrator_ndkdemo_MainActivity_hello (JNIEnv * env, jobject obj) { return env->NewStringUTF("Hello Jni---->C++!"); } #ifdef __cplusplus } #endif #endif
5、gradle配置
打开build.gradle(Module:app)
在defaultConfig中添加:
ndk { moduleName "hello" ldLibs "log","z","m" abiFilters "armeabi","armeabi-v7a","x86" }
此处生成的moduleName就是上边java代码中System.loadLibrary(“hello”);对应的名字
在gradle.properties中添加:
android.useDeprecatedNdk=true
最后一点不理解的是要在jni下随便建一个.cpp文件项目才能正确编译。
编译成功后在:
D:\android\project\NDKDemo\app\build\intermediates\ndk\debug
可以看到生成.so库。Android.mk文件也在该目录下,在eclipse项目中,NDK开发需要自己配置该文件,在android studio中会自动生成,自动生成,自动生成,重要的事情说三遍。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件