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