使用Android Sutdio创建一个JNI程序基本步骤如下:

  • 新建一个Android工程
  • 生成.c头文件
  • 编写实现native方法功能的cpp文件
  • NDK安装与配置
  • 运行程序

新建一个Android工程

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

project结构如下图:
Android Studio开发JNI - 第一个JNI程序_第1张图片

在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,将当前目录切换到\app\src\main\java下。然后执行如下命令:
这里写图片描述

执行过该命令后,将在\app\src\main\目录下创建一个名为jni的文件夹,并在其中生成与MainActivity对应的c头文件。执行完该命令后的project结构如下:
Android Studio开发JNI - 第一个JNI程序_第2张图片

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

/* DO NOT EDIT THIS FILE - it is machine generated */#include /* Header for class com_example_sunxiaodong_learnjni_MainActivity */#ifndef _Included_com_example_sunxiaodong_learnjni_MainActivity#define _Included_com_example_sunxiaodong_learnjni_MainActivity#ifdef __cplusplusextern "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文件

\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 #include #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 __cplusplusextern "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。

Android Studio开发JNI - 第一个JNI程序_第3张图片

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

Android Studio开发JNI - 第一个JNI程序_第4张图片

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

Android Studio开发JNI - 第一个JNI程序_第5张图片

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

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

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

执行“Build->Make Project”成功后,会在\app\build\intermediates\下生成如下.so文件:
Android Studio开发JNI - 第一个JNI程序_第6张图片

运行程序

运行该Android示例程序后,会输出一条如下log:
这里写图片描述

程序运行后,界面展示如下:
Android Studio开发JNI - 第一个JNI程序_第7张图片

示例源码

更多相关文章

  1. 第一个PhoneGap程序以及错误解决
  2. Android 根文件系统分析(1)
  3. [android] 保存文件到手机内存
  4. Android 将APK文件安装到AVD中并分析其界面结构
  5. 测试你的Android应用程序
  6. Android:theme="@android:style/Theme.Dialog"运行程序报错
  7. 移动开发:fb的-app.xml文件

随机推荐

  1. android中自定义Theme以及TitleBar
  2. Android中pm命令用法详解
  3. Android(安卓)拖拽
  4. Android(安卓)Wifi模块分析(二)
  5. drawable中的layer-list使用
  6. android触摸屏坐标手工校准/调整成功 (ZZ
  7. Android(安卓)中文api (88)——SharedPre
  8. FFmpeg for Android(安卓)collections
  9. Android(安卓)TabWidget/TabHost的使用
  10. Android:关闭软键盘自动弹出的解决方案