生成so庫(kù)供Java調(diào)用
在上次完成的gpio控制中,把c文件編譯成一個(gè)so庫(kù),供java程序調(diào)用.
準(zhǔn)備工作首先在網(wǎng)上查找了大量的資料,然后一步一步的按照網(wǎng)上的教程在linux平臺(tái)下面走了一邊,包括.java文件編譯成.class文件,然后生成.h文件,然后用c語言實(shí)現(xiàn)該方法即可.大概流程就是這樣,覺得很簡(jiǎn)單.下午往android代碼里面添加的時(shí)候發(fā)現(xiàn)很多問題.下面把詳細(xì)步驟記錄下來.
步驟平臺(tái):展訊的7715,安卓7.0
java代碼很簡(jiǎn)單,直接調(diào)用一個(gè)方法即可.用的還是HelloWorld示例.
System.loadLibrary(“HelloWorld”);
class HelloWorld {
static {
System.loadLibrary("HelloWorld");
}
private native void greeting();
public static void main(String[] args) {
new HelloWorld().greeting();
}
}
編譯生成.class文件,然后通過javah HelloWorld生成.h文件,然后編寫.c文件包含.h文件并實(shí)現(xiàn).h文件里面的方法.
#include "HelloWorld.h"
#include
#include
#include
#include
#include
#define DEV_IOC_MAGIC '0xee' //定義幻數(shù)
#define DEV_IOCPRINT _IO(DEV_IOC_MAGIC, 1)
#define DEV_IO_HIGH _IO(DEV_IOC_MAGIC, 2)
#define DEV_IO_LOW _IO(DEV_IOC_MAGIC, 3)
#define DEV_IOC_MAXNR 3
JNIEXPORT void JNICALL Java_HelloWorld_greeting
(JNIEnv *env, jobject obj) {
printf("Hello World!");
int cmd;
int fd;
int choice = 0;
fd = open("/dev/dsx", O_RDWR);
if(fd < 0)
printf("ni haishi dabukai ya !n");
/*命令1:打印串口信息*/
while(1)
{
int i=0;
printf("Please input choice: n 1: DEV_IOCPRINT; n 2: DEV_IO_HIGHn 3: DEV_IO_LOW n 4: EXIT n");
scanf("%d", &choice);
if(choice == 4)
{
printf("gpio test exitn");
break;
}
switch(choice)
{
case 1:
{
printf("<--- Call DEV_IOCPRINT --->n");
cmd = DEV_IOCPRINT;
if (ioctl(fd, cmd) < 0)
{
printf("Call cmd MEMDEV_IOCPRINT failn");
}
break;
}
case 2:
{
printf("<--- Call DEV_IO_HIGH --->n");
cmd = DEV_IO_HIGH;
if (ioctl(fd, cmd) < 0)
{
printf("Call cmd DEV_IO_HIGH failn");
}
break;
}
case 3:
{
printf("<--- Call DEV_IO_LOW --->n");
cmd = DEV_IO_LOW;
if (ioctl(fd, cmd) < 0)
{
printf("Call cmd DEV_IO_LOW failn");
}
break;
}
default:
break;
}
printf("nn===================================n");
}
}
直接把原來的代碼里面的main函數(shù)放到了Java_HelloWorld_greeting里面.
本以為這樣就可以了,但是編譯生成的so庫(kù)放到開發(fā)板里面怎么都不行,經(jīng)過師傅的講解以后(下面的步驟很關(guān)鍵哦),在external下面新建一個(gè)文件夾,然后把.c文件和.h文件放進(jìn)來,最重要的是要寫一個(gè)Android.mk文件.然后編譯安卓源代碼就可以了.
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_ARM_MODE :=arm
LOCAL_MODULE := **libHelloWorld**//一定要加上lib
LOCAL_SRC_FILES := HelloWorld.c
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)
include $(BUILD_SHARED_LIBRARY)
然后編譯該目錄,會(huì)在system/bin下面生成libHelloWorld.so.這個(gè)才是最終生成的so文件,把它push進(jìn)開發(fā)板的system/lib目錄下面,然后在開發(fā)板中運(yùn)行剛才寫的java代碼生成的.class就可以了.
感悟這個(gè)任務(wù)其實(shí)挺簡(jiǎn)單的,多查資料,實(shí)在搞不明白的問問師傅,很快就可以解決.