Android--JNI简单的实例解析
最近项目迭代了几个版本,目前比较轻松,虽然项目闲了,但是人不能太闲,否则就废了。千里之行始于足下、量变引起质变、学而不思则罔.......好了好了好了.....编不下去了,让我们直入正题吧,还是再说一句吧,欢迎大家交流学习,共同进步,欢迎扔搬砖,就算是你扔我也不接
一、新建一个Android项目,和以前自己建项目是一模一样滴
二、创建一个JNICall.java类:
创建一个本地方法,这个方法作为我们调用C/C++程序的接口,另外我们通过static的方式,静态的去加载.so文件。
三、添加本地支持
选中项目,右键---->Android Tools---->Add Native Support,如图:
这时会弹出一个Add Android Native Support对话框,此时我们输入我们的要加载的so文件的名称就ok啦:
此时项目会多出一个,jni文件夹,里面包含了一个my_jni.cpp和Android.mk文件,如图:
其中my_jni.cpp文件中只有一行代码,引入了jni库:
下面我们来看看Android.mk文件:
这个自动生成MakeFile文件中有多个属性:
LOCAL_PATH是C/C++代码所在目录,也就是我们的jni目录。
include$(CLEAR_VARS)代表清除之前的依赖类库
LOCAL_MODULE是要编译的库的名称,就是我们在Add Android Native Support对话框中输入的名称。编译器会自动在前面加上lib,在后面加上.so。
LOCAL_SRC_FILES是要编译的C/C++文件。
include$(BUILD_SHARED_LIBRARY)代表编译出来的是动态库,其中include $(BUILD_STATIC_LIBRARY),编译出的是静态库 。
四、编译JNI,下面我们需要生成.h的头文件:
找到Android项目中的bin文件夹,找到classes文件夹,eclipse为我们自动生成的字节码文件都在这个文件夹下面,首先在命令行中使用cd命令切换到该目录下,然
后使用javah命令,生成我们想要得到的.h头文件:
这个头文件生成的名字,我们是可以修改的,只要合法就可以,让我们来看一下生成的.h文件:
五、编写生成本地库的cpp文件:
这里我们需要引入头文件,关键的是我们来看一下方法名的格式:
Java_com_example_jnidemo_JNICall_myJni
Java:固定的写法,必须如此
com_example_jnidemo:为包含native方法的包名
JNICall:为包含native方法的类名
myJni:为native方法名
这几个方法名我们一定要对应起来,否则会出现错误:java.lang.UnsatisfiedLinkError: Native method not found
六、生成.so文件(这一步不是必须的,因为我们可以在运行的时候,eclipse可以自动会和项目一块编译生成.so文件,当然了我们也可以自己单独编译,下面介绍一下单独编译的过程)
首先通过命令cd进入到项目所在的目录,然后通过ndk-build命令生成.so文件:
说明so文件生成了,刷新一下项目,然后我们来看一下目录的变化:
七:调用native方法:
八、运行项目,效果如图:
目前为止,一个简单的JNI程序已经完成了