一、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工具開發