【NDK学习第二章】如何在自己的项目中使用NDK

这篇博客实现的是在项目中调用C文件来实现两个数的相加。
本文仅供参考,如果有不足的地方,欢迎指出。



主要有这么几个步骤:



步骤一: 在你的工程中新建一个类,这个类有两个作用,1.通过这个类,和本地C/C++代码打交道,实现代码结构上的耦合。2.javah通过这个类生成.h文件,你可以根据这个.h文件来编写.c文件。



步骤二: 在.c文件编写好了以后,我们就开始编写Android.mk文件,这个文件用来指定.c文件的位置。即告诉NDK,要被编译的.c文件在哪里。



步骤三: 使用cygwin编译生成库文件(.so),成功以后,拷贝到你的项目的libs文件夹下,你就可以在java类中调用库文件(C/C++)了。



步骤1:
新建一个工程:JNIDemo
新建一个类:Calculate.java 通过这个类用来和本地C/C++代码交互,相当于是一个接口的作用。注意:这个类可以不是静态类,只是我认为写成静态的使用起来会比较方便,你也可以不写成静态类。
public class Calculate {

	public static native int plus(int x, int y);
	
	static{
		
		System.loadLibrary("calculate");//要加载的库的名称
	}
}


工程结构:
[img]

[/img]

根据上面的Calculate.java 来生成C的.h头文件,这个头文件的作用是用来定义C的实现,它只和.c文件有关。对于项目的编译和运行没有意义。

具体做法是:通过命令行进入到项目的bin\classes目录下,执行javah命令,如图:
[img]

[/img]


打开你的项目你会在bin\classes目录里面发现一个.h文件,如图:
[img]

[/img]


这时候你就可以根据自动生成的.h文件来编写具体的.c实现文件了:

你可以这样做:在项目根目录下新建一个jni文件夹,将刚才生成的.h文件拷贝进来,然后针对这个.h文件编写具体的实现。剩下的就是业务的问题了。这里贴出我的代码

com_michael_jni_Calculate.c:
#include <string.h>
#include <jni.h>



JNIEXPORT jint JNICALL
Java_com_michael_jni_Calculate_plus( JNIEnv* env,
                                                  jobject thiz,
                                                  jint x,
                                                  jint y )
{
    return x + y;
}







步骤2:
在jni文件夹下编写Android.mk文件,如下:

Android.mk文件用来告诉NDK需要编译的C/C++源文件的位置。

LOCAL_PATH 代表的是.c文件的位置,$(call my-dir)返回Android.mk文件所在目录的路径

LOCAL_MODULE 代表的是共享库的名称

LOCAL_PATH := $(call my-dir)

 

include $(CLEAR_VARS)

LOCAL_MODULE    := calculate
LOCAL_SRC_FILES := com_michael_jni_Calculate.c

include $(BUILD_SHARED_LIBRARY)







步骤3:
在ndk安装目录中的samples文件夹下新建一个文件夹,该文件夹和你的项目名相同,并在这个项目文件夹下新建一个名为jni的文件夹,然后将刚才编写好的Android.mk和.c文件放到这个jni文件夹下,如图:
[img]

[/img]


打开Cygwin.bat,生成库文件,如图:
[img]

[/img]

生成完以后项目文件夹目录下多了libs和obj这两个文件夹,如图:
[img]

[/img]

这个时候,对我们有用的就是libs文件,打开这个文件夹,你可以把里面的armeabi文件整个拷贝到你的项目的libs文件夹下面。


最终的项目结构图为:
[img]

[/img]


这时候你就可以调用你所编写的本地C/C++库(calculate)了。
项目运行的效果如下图:
[img]

[/img]




猜你喜欢

转载自android-zhang.iteye.com/blog/1779326