今天讲个Android JNI的用法。
这个是我两年以前最头疼的问题。
感觉应该写出来分享给大家。
OK 我的NDK安装在了Ubuntu的此目录当中
1.把你的程序拷贝到apps目录里并且修改你的Application.mk
APP_MODULES := mylib
这里mylib是指定自己使用的库名称
2.如果使用其他库请把.a或.so文件拷贝到此目录
out/apps/<MyProject>/android-1.5-arm
3.先配置Android.mk,设置引用的静态库.a,动态库.so,输出名称
cd 到 sources/samples/<myproject>
Android.mk的内容如下。
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := mylib
LOCAL_SRC_FILES := myjni.c
LOCAL_SHARED_LIBRARIES := libcrypto libssl libsqlite
LOCAL_STATIC_LIBRARIES += libhttpd liblightcomp libmod_dirlisting libmod_auth libmod_accesslog libmod_rewrite libmod_alias libmod_indexfile libmod_staticfile libmod_webdav libmod_percent libmod_upfile libmod_datalisting libxml2 libpcre libuuid libmutex
include $(BUILD_SHARED_LIBRARY)
注意:
mylib要跟第1部分中的名称一样。
myjni.c是我们即将写入的JNI文件
LOCAL_SHARED_LIBRARIES里的文件可以预先把android自带的so文件拷贝到第二部分中,可以有效降低最终生成的库文件大小。
LOCAL_STATIC_LIBRARIES静态文件链接顺序要格外注意,你知道的。
4.开始写Jni文件myjni.c
JNI_OnLoad初始化,声明函数名。。。。
编译的出库文件
# make APP=<MyProject>
稍等片刻,库文件生成到apps/<MyProject>/project/libs/armeabi/libmylib.so
把此库文件Eclipse项目-><myproject>/libs/armeabi
5.写java部分youactivity.java
声明库文件
static {
System.loadLibrary("mylib");
}
public static native void setHttpdConf(String file);
public static native void setUploadTempDir(String dir);
public static native void setUseDirect(int dir);
public static native void setTooLarge(int dir);
public static native void setTopDir(String dir);
public static native void setParam(String usr, String passwd, String broker);
public static native void setAccessCallback();
用于c语言回调的函数sendAccess
返回值也可以被c语言获取
public static int sendAccess(String URL) {
return 0;
}
java的声明的静态函数setAccessCallback调用c语言的setAccessCallback函数,c语言处理完成之后并返回调用java的sendAccess函数。
并且sendAccess函数的返回值可以被c语言获取。完成这一轮的工作。