您的位置:首页 > 移动开发 > Android开发

Android Studio NDK环境配置与JNI简单的例子

2017-10-13 11:34 369 查看
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.喜欢的朋友欢迎点赞,请大家多多指教。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android studio ndk jni