您的位置:首页 > 编程语言 > C语言/C++

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++函数的地方声明本地方法

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中会自动生成,自动生成,自动生成,重要的事情说三遍。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android ndk C++