现在的位置: 首页 > 综合 > 正文

java程序调用C、C++动态库的几种实现方式,即JNI的应用方式

2018年06月10日 ⁄ 综合 ⁄ 共 1927字 ⁄ 字号 评论关闭

一、eclipse NDK 开发android JNI应用程序

概念解释:

NDK:native development kit,本地开发包,这个工具能够开发C\C++动态库,并能自动将linux动态库文件so和java应用一起打包成android的apk文件。开发包可作为插件安装到eclipse开发工具。

JNI:java native interface,java本地接口或叫java本地调用,它已成为java平台的一部分,通过这种标准,java程序可以调用本地的其他语言编写的库文件。

1、新建android应用项目,包名为com.ouling.JniCalculator

2、在JniCalculatorActivity这个类中调用C接口,则需要在文件中做如下处理:

      #声明要调用的接口函数:public native int add( int x, int y );   //一定要有关键字native,说明是本地调用函数,而不是自己的函数。

      #加载so库文件:static   { System.loadLibrary("JniCalculator"); }

      #程序中直接调用函数add

3、给项目添加本地支持(Add Native Support),则在项目目录中多了jni目录,该目录中有两个文件JniCalculator.cpp和Android.mk文件

4、JniCalculator.cpp:是java和C++的桥梁,该文件是jni类型的C++文件,因为,它的编写必须符合jni规则。

        #接口数据类型: 编写代码时必须使用用jni.h中定义的本地数据类型,数据类型一般为java类型前加j,一定要同JniCalculatorActivity这个文件中接口函数的数据类型对应起来,如返回值的数据类型为int,则此处的返回值对应为jint。

       #接口函数名定义规则:JNIEXPORT+返回值类型+JNICALL+Java+调用的包名+类名+方法名,如下:

                                    JNIEXPORT jint JNICALL Java_com_ouling_JniCalculator_JniCalculatorActivity_add   

      #接口函数的实现:可用jni类型,也可以用标准的C++类型

      #非接口函数:可以用标准C++编写,供接口函数调用。

     #用C++编译器编译

4、Android.mk文件:用于描述代码的编译规则,有NDK插件自动生成

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := JniCalculator
### Add all source file names to be included in lib separated by a whitespace
LOCAL_SRC_FILES := JniCalculator.cpp

include $(BUILD_SHARED_LIBRARY)

说明:
 #每个编译模块都是以include $(CLEAR_VARS)开始,以include $(BUILD_SHARED_LIBRARY)结束。

 #LOCAL_PATH := $(call my-dir):编译系统根据这个来寻找所需的源代码,my-dir指返回当前目录。因此需要把Android.mk和JniCalculator.cpp文件放在同一目录

#include $(CLEAR_VARS):重置所有的LOCAL_XXX形式的变量,因为在其下面要新定义

#LOCAL_MODULE    := JniCalculator:模块名,注意一定要唯一且不包含空格字符

#LOCAL_SRC_FILES := JniCalculator.cpp:要编译的源文件

#include $(BUILD_SHARED_LIBRARY):编译要生成类型

二、androd操作系统内jni的开发

具体开发详情见:

android内核字符驱动设备实战之----------应用框架层jni动态库编程篇

三、应用层开发jni同系统内开发jni的区别

1、文件名区别:应用层的jni文件名,不需要包含java调用类的信息,而系统则需要

2、jni接口函数名:应用层的jni接口函数名,需要包含java调用类的信息,而系统则不需要。

     可能是异曲同工之妙也说不准呢!!!!???吐舌头

3、系统层需要定义方法表,同时要注册加载方法表;而应用层则不需要。

    可能是eclipse的ndk编译工具或者是系统内部,已经内部隐含处理了

4、应用层程序的java类调用jni时,要先加载jni库,而系统则不需要

抱歉!评论已关闭.