1 在AS中新建一个Project,然后再新建一个class为NdkJniUtils,在内部声明native方法

/**
 * Created by Administrator on 2016/7/20.
 */
public class NdkJniUtrils {
    static {
        System.loadLibrary("MyJniSo");   //defaultConfig.ndk.moduleName
    }
    public native String saySomething();
}

2 在工程主文件Activity中写入如下代码调运JNI的东西显示在UI上。

public class MainActivity extends AppCompatActivity {
    private TextView mText;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mText = (TextView)findViewById(R.id.text);

        NdkJniUtrils jni=new NdkJniUtrils();
        mText.setText(jni.saySomething());
    }
}

3 然后build project得到其中中间文件,我们关注的是.class文件。编译OK以后生成的class文件在AS工程的如下目录:

NDKApplication\app\build\intermediates\classes\debug

然后接下来的步骤就是根据生成的class文件,利用javah生成对应的 .h头文件。

点开AS的Terminal标签,默认进入到该项目的app文件夹下。我在windows平台下输入如下命令跳转到class中间文件生成路径:

xxxxx\app> cd build\intermediates\classes\debug

然后执行如下javah命令生成h文件。

xxxxx\debug> javah -jni com.example.administrator.jnitestdemo.NdkJniUtrils

执行完之后你可以在文件夹NDKApplication\app\build\intermediates\classes\debug下看见生成的 .h头文件为:

com_example_administrator_jnitestdemo_NdkJniUtrils.h

4 在工程的main目录下新建一个名字为jni的目录,然后将刚才的 .h文件剪切过来。在jni目录下新建一个c文件,随意取名我命名为 jniTest.c

 也要建立一个empty.c 否则会报错,这里是NDK编译单个文件的一个BUG。

5 在工程中配置好NDK的路劲

6 接下来在app module目录下的build.gradle中设置库文件名(生成的so文件名)。找到gradle文件的defaultConfig这项,在里面添加如下内容:

    defaultConfig {
        applicationId "com.example.administrator.jnitestdemo"
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"

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

7 现在生成的so库名字也有了,那就去代码的NdkJniUtrils.java文件添加静态初始化load代码,添加如下:

好了,到此AS下NDK JNI开发的代码编写和设置就OK了,接下来就是编译工程运行就可以了。

编译运行结果如下

posted on 2016-07-20 17:51  青年程序猿  阅读(163)  评论(0)    收藏  举报