JNI 使用案例详解(一)

  很久没有写博客了,今天来写一下关于在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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值