Android經常會調用到jni庫,作爲廠商經常需要提供jni庫給用戶,一方面是對客戶提供接口,方便客戶操作。
另一方面,算法或者設備操作細節不方便對客戶公開,對我們代碼起到保密作用。
以建立一個Pwm爲例,以下分幾步介紹jni創建,示例打印log,不具體操作設備文件。
文章分爲5步:1、NDK環境配置 2、創建jni文件 3、激活NDK 4、Java編寫 5、運行演示結果
1、NDK環境配置
eclipse基本配置就不描述了.NDK是編譯jni的工具,可以理解成google修改過的可以編譯Makefile的工具。
Window->Preferences->Android->NDK,配置NDK路徑如下圖。
2、創建jni文件
創建jni目錄
創建pwm.c文件在新建的jni目錄下.函數命名規則Java_包名_類名_函數名(...),必須和java包名類名一樣,如果不一致,運行時候會報加載庫錯誤。(參考“4、Java編寫”的包名和類名)
#include <jni.h>
#include <android/log.h>
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, "pwm", __VA_ARGS__)
JNIEXPORT int JNICALL Java_com_oo_pwm_Pwm_open(JNIEnv * env, jobject jobj)
{
LOGD("pwm open\n");//打印Log
return 0;
}
編寫Android.mk文件在新建的jni目錄下
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE:= libpwm #庫名
LOCAL_SRC_FILES:= pwm.c #源文件
LOCAL_LDLIBS :=-llog #打印Log需要的庫
include $(BUILD_SHARED_LIBRARY) #生成共享庫
注意這部分代碼,不能直接複製到你的工程,否則eclipse識別錯誤。需要自己手動輸入。
3、激活NDK
Android Tools->Add Native Support
Project->Build Project,編譯生成pwm.so
C:\jre\android-ndk-r8e\ndk-build.cmd all
"Compile thumb : pwm <= pwm.c
SharedLibrary : libpwm.so
Install : libpwm.so => libs/armeabi/libpwm.so<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> </span>
4、Java編寫
建立Pwm類到com.oo.pwm包下,請注意這裏的包名和類名。
Pwm.java代碼
建立Pwm接口
package com.oo.pwm;
public class Pwm {
static {
System.loadLibrary("pwm");//lib不用寫
}
public native int open();
}
MainActivity.java代碼
調用Pwm接口
package com.oo.pwm;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
public class MainActivity extends Activity {
private Pwm mPwm;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mPwm = new Pwm();
mPwm.open();
}
}
5、運行演示結果
提示"pwm open",成功執行到jni open函數
錯誤處理:
找不到include文件
Project->Properties->C/C++ General->Path and Symbols
點擊Add,加入ndk的include路徑
點擊Export