一、JNI简介
JNI全称为Java Native Interface(JAVA本地调用)。从Java1.1开始,JNI成为java平台的一部分,它允许Java代码和其他语言写的代码(如C&C++)进行交互。并非从Android发布才引入JNI的概念的。
二、JNI与NDK
简单来说,Android的NDK提供了一些交叉编译工具链和Android自带的库,这些Android的库可以让开发者在编写本地语言的程序时调用。而NDK提供的交叉编译工具链就对已经编写好的C&C++代码进行编译,生成库。
当然了,你也可以自己搭建交叉编译环境,而不用NDK的工具和库。然后生成库,只要规范操作,一样可以生成能让JAVA层成功调用的库文件的。
三、开发步骤
理论性的东西太多,百度都可以查得到,我这里就将一些使用的,具体的操作步骤。按照这个步骤来做,一定可以写成功。我们常用的开发工具有两种,eclipse和As我们这里分别来介绍。
本篇主要介绍eclipse的用法,已经出现的一些常见的错误及解决办法。
1,在官网上下载ndk,直接解压。
2,配置ndk:window->prferences->Android ->NDK->选择ndk的路径
3,在java代码中声明在c中要调用的函数。
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tv = (TextView) findViewById(R.id.tv);
tv.setText(getString());
}
//声明调用JNI库的函数且前面添加native关键字
public native String getString();
}
4,进入D:\Android\JniDemo\src,然后按住shift键,点鼠标右键,然后选择”在此次打开命令窗口“,然后进入doc命令的界面, 然后输入命令javah com.example.jnidemo.MainActivity如果没有错误,则会在D:\Android\JniDemo\src下生成一个文件 com_example_jnidemo_MainActivity.h,然后在程序中按f5刷新,在com.example.jnidemo下出现 com_example_jnidemo_MainActivity.h文件。
5,选中项目,点击反键->Android Tools->Add Native support,然后给你的.so文件取一个名字,然后finish.(如果finish是灰色的, 不可以点,那就检查ndk配置是否正确)
6 然后在项目的根目录下会产生一个文件夹jni,里面有两个文件Android.mk和JniDemo.cpp,将JniDemo.cpp文件名修改成JniDemo.c,然后点开Android.mk将里面的JniDemo.cpp改为JniDemo.c
7,将第4部生成的 com_example_jnidemo_MainActivity.h转移到jni文件夹中。然后打开.h文件夹,将里面的方法复制到JniDemo.c文件夹中,然后补全参数和要实现的逻辑代码。在.c中加入导入文件的代码。
com_example_jnidemo_MainActivity.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_jnidemo_MainActivity */
#ifndef _Included_com_example_jnidemo_MainActivity
#define _Included_com_example_jnidemo_MainActivity
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_example_jnidemo_MainActivity
* Method: getString
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_example_jnidemo_MainActivity_getString
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
JniDemo.c
#include <stdio.h>
#include <stdlib.h>
#include "com_example_jnidemo_MainActivity.h"
JNIEXPORT jstring JNICALL Java_com_example_jnidemo_MainActivity_getString
(JNIEnv * env, jobject job){
return (*env)->NewStringUTF(env, "hello2222");
}
关联ndk(如果.c文件或者.h文件报错,暂时不要管),一下ndk:选中项目,右键->properties->c/c++ General->Includes->Add->file System -> 选中ndk中include所在的目录D:\BaiduYunDownload\android-ndk32-r10-windows-x86\android-ndk-r10\platforms\android-9\arch-arm\usr\include->ok->apply->ok。此时重新报错.c文件和.h文件,如果还报错,则clear一下。
8在java中使用System.loadLibrary()函数来引用JNI库,调用native函数。
public class MainActivity extends Activity {
{
System.loadLibrary("JniDemo");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tv = (TextView) findViewById(R.id.tv);
tv.setText(getString());
}
//声明调用JNI库的函数且前面添加native关键字
public native String getString();
}
用eclipse开发的基本步骤就是这些了,需要的朋友可以下载一下源码:源码
下一篇博客将介绍怎么用Android Studio开发jni :Android关于JNI开发(2)-----Android Studio工具开发