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

Android Studio开发JNI - 第一个JNI程序

2016-06-15 01:03 465 查看
使用Android Sutdio创建一个JNI程序基本步骤如下:

新建一个Android工程

生成.c头文件

编写实现native方法功能的cpp文件

NDK安装与配置

运行程序

新建一个Android工程

示例中,我新建了一个名为LearnJni的Android工程。

project结构如下图:



在MainActivity中编写示例代码如下:

public class MainActivity extends AppCompatActivity {

static {
System.loadLibrary("myjni");
}

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView textView = (TextView) findViewById(R.id.text_view);
textView.setText(getJniMessage());
}

public native String getJniMessage();

}


在静态初始化块中,我们调用
System.loadLibrary("myjni")
来加载下面我们将会命名为“myjni”的jni库文件。并在程序中定义并使用了
getJniMessage()
本地方法。

生成.c头文件

使用Android Studio自带的Terminal或你计算机系统的Terminal,将当前目录切换到
<Project>\app\src\main\java
下。然后执行如下命令:



执行过该命令后,将在
<Project>\app\src\main\
目录下创建一个名为jni的文件夹,并在其中生成与MainActivity对应的c头文件。执行完该命令后的project结构如下:



生成的.c头文件内容如下:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_sunxiaodong_learnjni_MainActivity */

#ifndef _Included_com_example_sunxiaodong_learnjni_MainActivity
#define _Included_com_example_sunxiaodong_learnjni_MainActivity
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class:     com_example_sunxiaodong_learnjni_MainActivity
* Method:    getJniMessage
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_example_sunxiaodong_learnjni_MainActivity_getJniMessage
(JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif


编写实现native方法功能的cpp文件

<Project>\app\src\main\jni
下,新建一个cpp文件。将上一步生成的.c头文件中的内容,拷贝到该cpp文件中。并根据具体需要的功能,实现相应native方法。示例中,我新建了一个名为MyJniMessage.cpp的文件,具体实现内容如下:

//
// Created by sunxiaodong on 16/6/14.
//
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
#include <android/log.h>
#ifndef LOG_TAG
#define LOG_TAG "MY_JNI_LOG"
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)
#endif
/* Header for class com_example_sunxiaodong_learnjni_MainActivity */

#ifndef _Included_com_example_sunxiaodong_learnjni_MainActivity
#define _Included_com_example_sunxiaodong_learnjni_MainActivity
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class:     com_example_sunxiaodong_learnjni_MainActivity
* Method:    getJniMessage
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_example_sunxiaodong_learnjni_MainActivity_getJniMessage
(JNIEnv *env, jobject jObj) {
LOGE("jni输出的log");
return (*env).NewStringUTF("我的第一个Jni");
}

#ifdef __cplusplus
}
#endif
#endif


作为示例,
getJniMessage()
方法的native实现很简单,仅输出一条log,并创建一个字符串。

通过上面步骤,我们Jni示例程序的编写已经完成,接下来,执行“Build->Make Project”,如果你之前没有安装NDK,则会有以下“Messages Gradle Build”提示:

Error:Execution failed for task ':app:compileDebugNdk'.
> NDK not configured.
Download the NDK from http://developer.android.com/tools/sdk/ndk/.Then add ndk.dir=path/to/ndk in local.properties.


接下来,下载安装NDK,并进行相关配置。

NDK安装与配置

进入SDK Manager,按下图所示,安装NDK。



在local.properties中,指定ndk路径。



<Project>\app\build.gradle
文件中,添加ndk配置。



以上配置代码指定的so库名称为myjni,链接时使用到的库,及最终输出指定三种abi体系结构下的so库。

完成如上的NDK的安装和配置,再次执行“Build->Make Project”,则可能会有以下“Messages Gradle Build”提示:



如果出现该错误,则gradle.properties中添加android.useDeprecatedNdk=true。

执行“Build->Make Project”成功后,会在
<Project>\app\build\intermediates\
下生成如下.so文件:



运行程序

运行该Android示例程序后,会输出一条如下log:



程序运行后,界面展示如下:



示例源码
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息