Android JNI(NDK)简单学习(环境搭建,创建一个JNI项目的基本流程)

最近在看Android增量更新的这块内容,发现需要用到Android JNI的这块知识,因此就简单的学习了一下。记录下学习的内容,以便以后再用到。

参考:http://blog.csdn.net/shulianghan/article/details/18964835#

1、环境搭建,无论做什么开发第一步肯定是搭建环境,这里也不例外

依据官方GUIDES,知道要下载三个部分文件,分别是:

NDK:一组工具让你能够在Android中使用C和C++代码

CMake:一个额外的构建工具和Gradle一起去建立你的native库。如果你只打算使用ndk-build,就不需要这个组建

LLDB:用于在Android Studio中调试native代码

具体的安装方法:

Android Studio中打开Tools->Android->SDK Manager(如图)

选中需要下载的内容,然后点击应用,等待安装完成


2、环境搭建完成,下面就来讲解一下如何建立第一个JNI程序

a.在你需要的地方写一个native方法(我是在MainActivity中定义了一个求和函数)

static {
        System.loadLibrary("JniTest");//你调用的库
    }

    public native int getValue(int x, int y);

这时候你会发现getValue方法报错被画了红线(肯定的啊,库还没有,怎么会有这个方法呢),不过没关系,我们可以忽略这个错误

然后点击Bulid->Make Project,编译生成二进制文件(发现竟然没出错,看来上面的错误的确不影响),然后会在一下目录中找到编译后的文件


b.下一步就是生成JNI文件了

在AS 的控制台中执行命令javah,生成c语言头文件这里需要注意的是要进入 <Project>\app\src\main的目录下执行javah命令,为的是生成的 .h 文件同样是在<Project>\app\src\main路径下,可以在Studio的工程结构中直接看到。

操作命令:
javah -d jni -classpath <SDK_android.jar>;<APP_classes> com.hdh.androidndkfirst.MainActivity


C:\Users\Kira\Desktop\AndroidNDKFirst\app\src\main>javah -d jni -classpath E:\android\android_stdio_sdk\android_stdio_s
dk\platforms\android-19\android.jar;C:\Users\Kira\Desktop\AndroidNDKFirst\app\build\intermediates\classes\debug com.hdh
.androidndkfirst.MainActivity
执行一下,你会发现目录中多了一个文件夹和文件



这就是C语言的头文件

C.在jni目录中新建一个C文件(如下图)


打开main.c文件在里面实现头文件里面的方法,如下图,jni中的jint值类型对应于java中的int类型



D.修改build.gradle文件

在该文件中的defaultConfig的添加

ndk {
            moduleName "JniTest"##这个名称就是将要生成的库文件的名称
            ldLibs "log", "z", "m"
            abiFilters "armeabi", "armeabi-v7a", "x86"
        }



然后在点击Build->Make Project发现竟然报错了


哈哈,不要怕,这个问题很简单,错误日志里都告诉我们怎么改了。打开gradle.properties,在里面添加

android.useDeprecatedNdk=true

然后再Make Project一下,OK了,一切都是那么的顺利,哈哈,然后我们将如下图一样看到生成的库文件


到这里基本也算成功了,然后我们回到MainActivity文件里发现getValue方法不报错了

public native int getValue(int x, int y);
最后见证奇迹的时候到了,我们在MainActivity将getValue方法的结果以日志的形式输出

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d("hdh", getValue(1, 2) + "==========");
    }
你会看到,哈哈



至此,一个简单的JNI程序就这么很自然的完成了,是不是觉得很简单。不过这只是最初级的,想要深入的理解还要不断学习。


猜你喜欢

转载自blog.csdn.net/android_hdh/article/details/52815519