初玩JNI

来源:互联网 发布:淘宝保健食品 编辑:程序博客网 时间:2024/05/20 23:32

最近玩了下JNI,今天就来记录下来JNI的一些步骤


以前在Eclipse上面玩JNI配置是很麻烦的,现在用AS了,感觉简单的就不止一点点了


1.首先从官网上下载NDK,并配置好环境变量

2.在AS的Structure里面配置好相应的路径

3.新建项目,并创建class文件

public class JniUtils {    public static native String getString();}

4.Make Project 后 在app\build\intermediates\classes\debug里面找到相信的Class文件

5.打开Terminal,cd到上面的debug文件夹中

6.javah -jni com.example.xf.jnidemo.Jniutils(包命加类名)命令来生成头文件

/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class com_example_xiefei_jnidemo_JniUtils */#ifndef _Included_com_example_xiefei_jnidemo_JniUtils#define _Included_com_example_xiefei_jnidemo_JniUtils#ifdef __cplusplusextern "C" {#endif/* * Class:     com_example_xiefei_jnidemo_JniUtils * Method:    getString * Signature: ()Ljava/lang/String; */JNIEXPORT jstring JNICALL Java_com_example_xiefei_jnidemo_JniUtils_getString  (JNIEnv *, jclass);#ifdef __cplusplus}#endif#endif


成功后你就会在debug中发现.h的头文件,把头文件剪切,并在main文件夹中创建jni和jniLibs文件夹,把.h的头文件粘贴在jni里

7.在jni的文件夹中创建.c文件,文件名随便取


#include "com_example_xiefei_jnidemo_JniUtils.h"JNIEXPORT jstring JNICALL Java_com_example_xiefei_jnidemo_JniUtils_getString  (JNIEnv *env, jclass obj){  return (*env)->NewStringUTF(env,"This just a test for Android Studio NDK JNI developer!");  }


8.在app moudle中配置

 defaultConfig {        applicationId "com.example.xiefei.jnidemo"        minSdkVersion 21        targetSdkVersion 25        versionCode 1        versionName "1.0"        ndk{            moduleName "jniTest"            abiFilters "x86","armeabi"        }    }    sourceSets.main{        jni.srcDirs "src/main/jni"        jniLibs.srcDir "src/main/jniLibs"    }    buildTypes {        release {            minifyEnabled false            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'        }    }}
配置好了 ndk 和 sourceSets.main后在gradle.properties中加上

android.useDeprecatedNdk=true


9.Build->Make Project,会自动生成.so库,保存的路劲为\app\build\intermediates\ndk\debug\lib

找到.so文件,copy到jniLibs文件夹

10,在用之前,我们用静态代码块来加载so库

static {    System.loadLibrary("jniTest");}
嗯。。。其实还有个问题,我在配置这10步之后编译,报错

java.io.IOException:Could not delete folder path(就是开始那个debug文件夹的路径)

我也是百思不得其解,可能是由于JNI这块还不成熟吧,我多clean几次,又莫名奇妙的编译通过了。

好了,基本步骤也就这些了,后面还有新的东西我在记录


public class MainActivity extends AppCompatActivity {    static {        System.loadLibrary("jniTest");    }    private TextView content;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        content = (TextView) findViewById(R.id.tv_content);        content.setText(JniUtils.getString());    }}
效果图就不展示了

0 0
原创粉丝点击