JNI & NDK 实例讲解一 (不通过NDK创建JNI项目)

          什么是JNI?什么是NDK,JNI 和 NDK 之间有什么关系?

          什么是JNI:JNI的全称是 Java Native Interface。它提供了一些API,用于实现Java 和其它语言之间进行相互调用(一般是指c/c++)。一般有以下三种情况需要c/c++协助

                a:调用驱动,由于操作系统所提供的驱动一般都是C接口。Java语言本身不具备操作这些驱动的能力。
                b:对于某些大量数据处理的模块,Java的效率可能低于C,因此,程序员希望使用C去完成。
                c:对于某些功能模块,Java可能和C的效率差不多,但是这些模块已经存在已有的C代码,程序员不想再用Java重写,而只想重新利用已有的C代码。

          什么是NDK:NDK的全称是Native Development Kit。NDK是一系列工具的集合,帮助开发者在Java项目中也能快速的开发C/C++动态库,并能自动将so库和java应用一起打包成apk。为什么要使用NDK呢?

               a:代码的保护。由于apk的java层代码很容易被反编译,而C/C++库反汇难度较大。
         b:可以方便地使用现存的开源库。大部分现存的开源库都是用C/C++代码编写的。
         c:提高程序的执行效率。将要求高性能的应用逻辑使用C开发,从而提高应用程序的执行效率。
               d:便于移植。用C/C++写得库可以方便在其他的嵌入式平台上再次使用。

         JNI & NDK的关系:JNI是用来开发可以与C/C++交互的项目。而NDK是一个工具,是让程序员可以直接在Java项目中添加C/C++代码,如果没有NDK,那么在开发JNI项目的时候,必须要在C/C++开发工具中去写C代码,并生成dll文件,然后再放入Java项目中。

         好了,上面大概讲了下JNI NDK概念上的一些东西。那么这章让我们看看不利用NDK如何来创建一个JNI项目吧。

        1:新建一个Java项目(File->New->Java Project->Project name输入MyTestJNI->finish)。新建一个Package(名字任意) 取名为TestJNI,并在该Package下面新建MyTestJNI.java  文件(在src上右键->Package->输入名字TestJNI->finish->在包TestJNI上面右键->New->Class->输入名字MyTestJNI,并选中public static main那项->finish)

        2:在MyTestJNI类里面添加public native int add(int a,int b);函数。然后我们需要生成native函数对应的.h文件。

        3:在电脑上进入到MyTestJNI.java文件所在目录的上一级目录下。MyTestJNI.java的路径为为: D:\java相关\EclipseWork\MyTest\MyTestJNI\src\TestJNI\MyTestJNI.java

        4:键盘上按下win+R 输入cmd,启动命令行窗口。在命令行窗口输入cd D:\java相关\EclipseWork\MyTest\MyTestJNI\src\TestJNI。回车,再输入D:回车。即进入该目录 

        5:在命令行输入javac MyTestJNI.java 然后在MyTestJNI.java 所在目录下生成了MyTestJNI.class文件。

        6:在命令行输入cd ..退至src目录下。输入javah TestJNI.MyTestJNI(TestJNI是MyTestJNI.java文件所在的目录名,MyTestJNI是MyTestJNI.class的名称)。回车就在src

               目录下生成了一个.h文件TestJNI_MyTestJNI.h。      

               

        7:利用vs或者vc++6.0开发工具创建一个C项目。若是没有C/C++开发工具,我上传了个vc++6.0绿色精简版,只需要把该文件解压,执行里面的ShortCut.exe,即会在桌面上生成一个快捷方式。http://yunpan.cn/cup3jcSaXfZwg  访问密码66ec

        8:启动vc++6.0,文件->新建->工程里选中Win32 Dynamic-Link Library,输入工程名称MyTest(名称任意)->确定->一个空的DLL->完成->确定。

        9:将TestJNI_MyTestJNI.h文件复制到该C项目MyTest目录下。然后再该C项目FileView->Header Files上右键->添加文件到项目,选中TestJNI_MyTestJNI.h文件确定,添加文件到项目中

     10:在该C工程里选中 文件->新建->文件 选中C/C++ Source File 输入文件名TestJNI_MyTestJNI(文件名可以任意)->确定。然后在Source Files目录下就有个TestJNI_MyTestJNI.cpp文件。

     11:点击编译会发现少了jni.h和jni_md.h文件。我们可以到Java jdk安装目录,include目录下拷贝jni.h文件,在include->win32目录下拷贝jni_md.h文件。并把这两个文件添加到C工程里面,并将TestJNI_MyTestJNI.h文件里面的#include <jni.h> 改成 #include ”jni.h“,用<>表示去系统目录下寻找该文件,用""表示到项目目录下去寻找该文件。

     12:在TestJNI_MyTestJNI.cpp里面添加代码,具体语法这里不做详解:

#include "TestJNI_MyTestJNI.h"

JNIEXPORT jint JNICALL Java_testJavaJNI_TestJNI_add (JNIEnv *, jobject, jint a, jint b)
{

	int result = (int)(a+b);

	return result;

}


    13:点击编译,那么在项目的Debug目录下生成了MyTest.dll。将该dll拷贝到之前创建的Java项目的与src同级目录下。

   14:在MyTestJNI.java里面添加代码,不过当执行java项目时控制台提示Can't load IA 32-bit .dll on a AMD 64-bit platform,原因是VC6.0不支持编译64位的dll,我用vs2012编译了一个64位的dll,关于vs如何编译64位dll可以参考该链接http://blog.sina.com.cn/s/blog_6e0693f70100t6ip.html。上面步骤中提供的是VC6.0的编译方式,因为上面上传的vc6.0比较小,也比较快的就可以搭建项目,目的在于让不熟悉C/C++的开发者快速熟悉C/C++工程的创建。而vs2012安装包比较大,安装过程比较常,但是生成dll的方式类似vc6.0,这里就不再做对vs2012的详解。若是熟悉C/C++项目开发的,可以跳过上面几步:

package TestJNI;

public class MyTestJNI {

	public native int add(int a, int b);  //native关键字说明其修饰的方法是一个原生态方法,方法对应的实现不是在当前文件,而是在用其他语言(如C和C++)实现的文件中。java编译器遇到native函数时,不会关心该函数的具体实现。

	static {
		System.loadLibrary("MyTest");   //引入dll库
	}

	public static void main(String[] args) {
		MyTestJNI test = new MyTestJNI();
		int a = 1, b = 2, result;
		result = test.add(a, b); //调用add方法,实现在dll当中
		System.out.println("结果为:" + result);
	}

}

  15:到此为止,这个JNI项目就创建好了,可以发现,过程有点复杂,需要去vc++6.0或者vs2012里面创建C代码,然后生成dll。那么有没有更方便直接在当前这个Java项目中生成这个dll呢?答案是当然有,那就是NDK,这也是google为什么提供NDK的原因。下一篇博客将介绍NDK开发环境的搭建及通过NDK来开发这个JNI项目。

    源码下载

JNI & NDK 实例讲解一 (不通过NDK创建JNI项目)

JNI & NDK 实例讲解二 (通过NDK创建JNI项目)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值