Android Studio开发JNI - 第一个JNI程序
2016-06-15 01:03
567 查看
使用Android Sutdio创建一个JNI程序基本步骤如下:
新建一个Android工程
生成.c头文件
编写实现native方法功能的cpp文件
NDK安装与配置
运行程序
project结构如下图:
在MainActivity中编写示例代码如下:
在静态初始化块中,我们调用
执行过该命令后,将在
生成的.c头文件内容如下:
作为示例,
通过上面步骤,我们Jni示例程序的编写已经完成,接下来,执行“Build->Make Project”,如果你之前没有安装NDK,则会有以下“Messages Gradle Build”提示:
接下来,下载安装NDK,并进行相关配置。
在
以上配置代码指定的so库名称为myjni,链接时使用到的库,及最终输出指定三种abi体系结构下的so库。
完成如上的NDK的安装和配置,再次执行“Build->Make Project”,则可能会有以下“Messages Gradle Build”提示:
如果出现该错误,则gradle.properties中添加android.useDeprecatedNdk=true。
执行“Build->Make Project”成功后,会在
程序运行后,界面展示如下:
示例源码
新建一个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:程序运行后,界面展示如下:
示例源码
相关文章推荐
- 使用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的冲突问题