Android中NDK和JNI开发基本流程

本文详细介绍了Android平台上的NDK和JNI开发流程,解释了为何选择C/C++进行开发的原因,并提供了从创建项目、声明本地方法到编译生成.so文件及在Java中调用的全过程指导。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


Android中进行NDK和JNI开发的基本流程:

1首先明确几个基本概念

      什么是NDK?什么是JNI?
      NDK就是Native Develop Kit 的缩写,专门为Android平台下开发本地函数而准备的开发工具,所谓本地函数   就是开发C或C++函数或库。所谓JNI,就是Java Native Interface的缩写,Java本地接口,能够调用C的动态函数库.so文件。既然Java已经很强大,为什么还要在Android平台上开发C或C++呢?
      原因有两个:1、有很多功能函数或库文件是使用C或C++编写的,虽然使用Java也能重新编写实现,但是既然已经有了实现的函数,为什么不直接拿来用呢?西方有句名言叫作“要发明轮子,但不要重复发明轮子!!”,我们只需要将已实现的函数拿过来用就可以了。没有必要再重复繁琐的工作  2、 Java语言容易通过反编译技术获取源代码,一些比较核心的算法代码容易被窃取,而采用C编写则不容易被反编译,保证安全性。
      既然有些时候我们要用到C编程,然而Android平台是用Java编写的,怎么使用C呢?   那就要用到JNI了,JNI的具体作用:实现Java调用C动态函数库,所谓C动态函数库,就是在linux环境下编译后得到的.so文件。另一方面,我们编写好了自己的C源文件,如何将它整成符合要求的.so文件,使得Java能够成功调用?? 那就要使用上面介绍的另一个工具NDK,NDK可以可以将我们写好的源文件编译成符合要求的.so文件。

2,下面介绍一下基本的流程

      首先要准备好开发工具:1,Android开发的Eclipse工具包括ADT;2,NDK
      然后进行Android项目的开发:1,新建一个新的Android工程,包括包和Java文件2,在Java文件中声明要使用的本地函数(如Public native void add(int,int);等)3,
使用javah文件生成此Java文件对应的头文件(注意a,此头文件在编译时使用的是Java源文件,编译时要带包编译,如com.example.hellojni.HelloJni,则应该在com的上一级目录中经行编译,源文件名带上包的名字,最后就会生成com_example_hellojni_HelloJni.h的头文件,此头文件的作用:仅仅是给编写cpp源文件提供了一个模板,按照.h文件中的方式进行编写b, javah的使用格式javah -d “编译结果存放路径” -JNI  -classpath “源文件路径”  "源文件")。
4,利用eclipse中的native tools进行JNI文件夹的创建,此时会自动创建android.mk文件和一个空的cpp文件,保存之后就会自动生成.so文件(事先创建了 configuration tools,NDK,否则要终端手动编译)。
5,按照之前生成的.h文件格式进行cpp的编写;
6,若要使用其他的cpp,则编写对应的.h文件声明各个函数,并编写cpp文件实现函数;
7,在Android.mk文件中添加所有的cpp文件,添加后保存,即可自动编译生成.so文件
8,在Java文件中创建静态代码块,中加载刚才生成的.so文件,system.loadlibrary()(注意要删掉生成的文件名前面的"lib");
9,调用本地函数;

//
super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        Log.i("ytj", ""+add(1, 6));
        Toast.makeText(getApplicationContext(), ""+add(1, 6), Toast.LENGTH_LONG).show();
        
        
        
    }
    public native int add(int a,int b);
    static
{
        System.loadLibrary("TestJni");  
}

//cpp

#include <jni.h>
#include<com_example_testjni_MainActivity.h>
JNIEXPORT jint JNICALL Java_com_example_testjni_MainActivity_add (JNIEnv * env,jobject obj ,jint a,jint b)
{


return a+b;


}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值