1.Android Studio 配置NDK非常简单,这里简单的介绍使用2.2.2版本配置NDK。
下载NDK,file->setting->Appearance->system Settings->Android SDK->SDK Tools中点击下载即可。如图下图所示:
2.新建工程项目,测试jni开发
3.设置支持jni
打开gradle.properties在里面添加android.useDeprecatedNdk=true
在local.properties在里面添加android里面添加
ndk.dir = NDK路径
sdk.dir = SDK路径
ndk.dir=D:\android-ndk-r10e
sdk.dir=E:\AndroidStudio\Android_Sdk
4.在那个module中的build.gradle中的android/defaultConfig下面添加ndk配置
ndk
{
moduleName "So库的名字"
}
在build.gradle中的android下面添加
sourceSets{
main{
jniLibs.srcDirs = ['libs']
}
}
5.新建java访问C层的接口类,创建一个Jni的工具类,并定义接口函数,函数关键字使用native。
6.生成头文件,build project 可以在app的build/intermediates/classes/debug中看到编译好的.class源文件。
7.打开终端Terminal 在里面通过命令生成.h文件
cd app/build/intermediates/classes/debug/
javah com.qihancloud.jnidemo.JniUtils(工具类的名称)
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_qihancloud_jnidemo_JniUtils */
#ifndef _Included_com_qihancloud_jnidemo_JniUtils
#define _Included_com_qihancloud_jnidemo_JniUtils
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_qihancloud_jnidemo_JniUtils
* Method: getStringFromC
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_qihancloud_jnidemo_JniUtils_getStringFromC
(JNIEnv *, jclass);
/*
* Class: com_qihancloud_jnidemo_JniUtils
* Method: getAdd
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_com_qihancloud_jnidemo_JniUtils_getAdd
(JNIEnv *, jclass, jint, jint);
#ifdef __cplusplus
}
#endif
#endif
8.在module中的main目录下通过鼠标右键new->folder->jni folder
将编译生成的.h文件拷贝到jni文件下面,新建.c文件
#include "com_qihancloud_jnidemo_JniUtils.h"
JNIEXPORT jstring JNICALL Java_com_qihancloud_jnidemo_JniUtils_getStringFromC
(JNIEnv *env, jclass) {
return env->NewStringUTF("Welcome to from C++");
}
JNIEXPORT jint JNICALL Java_com_qihancloud_jnidemo_JniUtils_getAdd
(JNIEnv *env, jclass obj, jint num1,jint num2) {
return num1+num2;
}
9.如何生成so文件:
在jni文件夹中新建Android.mk文件
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := JniDemo //so库的名字
LOCAL_SRC_FILES := com_qihancloud_jnidemo_JniUtils.cpp
include $(BUILD_SHARED_LIBRARY)
在jni文件家中新建Application.mk文件
APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions -std=c++0x
APP_ABI := armeabi-v7a x86 armeabi
APP_PLATFORM := android-18
在Terminal终端中,定位到module所在的目录,命令ndk-build编译会自动生成.so库文件,如下图所示:
10.相关的结构目录:
11.测试的时候,记得在工具类中添加
static
{
System.loadLibrary("JniDemo");
}
整个工具类代码:
public class JniUtils
{
public static native String getStringFromC();
public static native int getAdd(int a,int b);
static
{
System.loadLibrary("JniDemo");
}
}
12.具体的调用,如下代码所示:
public class MainActivity extends AppCompatActivity
{
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.i("Jnidemo", JniUtils.getStringFromC());
Log.i("Jnidemo", JniUtils.getAdd(3,4) + "");
textView = (TextView) findViewById(R.id.textview);
textView.setText(JniUtils.getStringFromC());
}
}
13.喜欢的朋友欢迎点赞,请大家多多指教。