很久没有写博客了,今天来写一下关于在android开发过程中使用JNI的详细案例及操作步骤。
首先,JNI,我的理解,他就是java和C之间的桥梁,很多写C++和JAVA的人不会写JNI,因为这两个方向的人,正常情况下都不会去用JNI来做什么,只有一些功能需要在C层来完成,而java层只是用来调用C层实现的代码逻辑的时候,就需要使用JNI来完成这部分工作了。
第一,首先我们说C层的实现:
首先,C++ 我们创建文件时,会生成两个文件,例如,我们命名为:TestCommitDemo.cpp,一个是.h文件,一个是.cpp 文件,这两个文件,一个是用来声明的,一个是用来实现的。我们在cpp内写了一个TestCommit()方法,需要java在适当的时机,来调用这个testCommit方法。那这时,我们就需要使用JNI文件来把这个方法转给java来实现了。
JNI文件同样的,创建的时候也是两个文件.h和.cpp 文件。例如,我们创建了两个文件,JNITest.cpp和JNITest.h 两个文件
- JNITest.h
-
- class JNITest {
-
- };
-
-
- JNITest.cpp
-
- #include "JNITest.h"
以上就是创建完成之后两个文件的内容。
然后,我们就开始把TestCommit()方法传递出去。首先,我们得知道,我们需要在哪里调用这个TestCommit方法。比如我们需要在TestActivity类中,调用这个方法。
那在JNITest.h 中可以声明这个方法
- JNIEXPORT void JNICALL Java_com_test_code_TestActivity_TestCommit(
- JNIEnv *env, jobject obj);
说明一下方法名和参数,JNIEXPORT 和JNICALL都是固定的,void表明这个方法不需要有返回值,若有返回值,可参考一下 几种类型,jint,jstring....之类的。
其次,Java_com_test_code_TestActivity_TestCommit 为JNI的方法名com_test_code_TestActivity
com_test_code 为你的包名,TestActivity 为你要调用c++中的方法名的类名。TestCommit 为方法的名称。至此,JNITest.h 中就可以完成了。剩下的就是JNITest.cpp 中如何实现这个方法了。
- JNIEXPORT void JNICALL Java_com_test_code_TestActivity_TestCommit(
- JNIEnv *env, jobject obj){
-
- TestCommitDemo testCommitDemo;
- testCommitDemo.testCommit();
- }
如上,我们创建了TestCommitDemo,用此对象来调用testCommit()方法。注意,.h 和 .cpp 内的两个方法名必须一模一样。至此,我们完成了JNI层和C层的全部代码。下面,我们就完成Java层的部署
1.因为我们项目中含有c文件,所以,不论我们是使用mk文件也好,使用cmake文件也好,总之, 都需要把c的代码进行编译,那编译的c模块的名称即 LOCAL_MODULE ,
System.loadLibrary("LOCAL_MODULE名称");
至此,我们就可以和我们的c部分绑定到一起了。
2.我们把JNI中相同的名称写入到java文件中,例如:private native void testCommit();
注意,一定要有native,这样才能调到JNI中声明的方法。
3.在适当的时机,即需要调用此方法的地方,java中调用即可实现。
over