Android Studio下JNI的使用案例

来源:互联网 发布:js按钮点击一次后失效 编辑:程序博客网 时间:2024/05/21 20:48

Android Studio下JNI的使用案例


1. 创建一个空的Android项目JNITest,在MainActivity类下,建立本地方法getSumFromC()

  • 在activity_main文件中生成一个按钮

    <Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:onClick="click"android:text="执行C代码" />
  • 在MainActivity类中,写入click()方法,并且弹出计算两个数和的土司

    public void click(View v){    Toast.makeText(this,"3 + 5的和为:" + getSumFromC(3,5),Toast.LENGTH_SHORT).show();}
  • 在MainActivity类中,写入本地方法getSumFromC()

    // 这是本地方法的格式public native int getSumFromC(int i, int j);

2. 点击Build -> Make Project,自动生成.class文件,生成的.class目录为:JNITest\app\build\intermediates\classes\debug,我们可以用.class文件生成一个.h文件

3. 利用生成的.class文件,在Terminal视图下,使用javah命令,会在main目录下生成一个名为jni的文件夹,并且生成带有jni语法的.h文件。

  • 调出Terminal视图,Terminal是android下的命令行窗口,可以输入命令

  • 在Terminal视图下,执行cd app/src/main进入到main目录下,使用如下的javah命令,生成.h文件

    // 这个命令包括了android编译类包,support-v4类包,support-v7类包的支持,不写可能会报错。其中F:\Tools\Android\SDK表示的是SDK的安装目录,你们改成自己的SDK目录就行,还有最后的包名,也需要改成你们自己的项目包名。javah -d jni -classpath F:\Tools\Android\SDK\platforms\android-21\android.jar;F:\Tools\Android\SDK\extras\android\support\v4\android-support-v4.jar;F:\Tools\Android\SDK\extras\android\support\v7\appcompat\libs\android-support-v7-appcompat.jar;..\..\build\intermediates\classes\debug com.itheima.jnitest.MainActivity

4. 在生成的jni目录下,新建一个hello.c文件,将步骤3中生成的.h文件中的c操作语句拷贝过来,并且使用jni语法进行修改。这里因为谷歌自身的一个bug,jni文件夹需要两个以上.c文件,因此我们自己再建一个test.c文件

  • hello.c文件代码如下,这只是一个求和的示例,你们也可以做成求差的案例,但是要注意jni语法的使用

    #include <jni.h>jint Java_com_itheima_jnitest_MainActivity_getSumFromC(JNIEnv * env, jobject thiz, jint i, jint j){    return i + j;}

5. 写完了c文件,我们点击Build -> Make Project会提示我们需要进行配置

  • 配置local.properties文件,这是配置NDK的路径

    sdk.dir=F:\\Tools\\Android\\SDK# 配置NDK的路径ndk.dir=F:\\Tools\\Android\\android-ndk-r10b
  • 配置app->build.gradle文件,在defaultConfig中添加以下代码

    ndk{    moduleName "hello"         // 定义生成so库文件的名字    abiFilters "armeabi", "armeabi-v7a", "x86"  // 输出指定三种abi体系结构下的so库文件。目前可有可无}

6.配置完成,再执行Build -> Rebuild Project,会提示我们已生成so动态链接库文件

7. 加载so动态链接库文件,运行代码,成功弹出计算和的土司

  • 在MainActivity类下加载c库文件

    static {    System.loadLibrary("hello");}
  • 运行程序,成功弹出土司

0 0