Android JNI完整调试过程

整个JNI的调试过程如下:

1.创建手电筒工程
在工程中加入一个开关手电筒的类,其中将调用lib层的函数声明为native。另外,还要引入c++编译生成的so库,如果编译成的so名为liblight,则引入名称为light。代码示例如下:
package com.flashlight.jni;
public class OnOffFlashlight {
public native void onFlashlight();
public native void offFlashlight();
static{
System.loadLibrary("light");
}
}

2.生成.h文件
在命令行中进入Android工程的bin目录,运行如下命令:
D:\workspace\Rflashlight\bin>javah -classpath . -jni  com.flashlight.jni.OnOffFlashlight
将生成名为“com_flashlight_jni_OnOffFlashlight.h”的文件。
自己编写“com_flashlight_jni_OnOffFlashlight.cpp”实现.h中的函数。手电筒代码范例如下:

#include "com_flashlight_jni_OnOffFlashlight.h"


JNIEXPORT void JNICALL Java_com_flashlight_jni_OnOffFlashlight_onFlashlight
(JNIEnv *, jobject)
{
write_int(TORCH_LED_FILE, 255);
}

JNIEXPORT void JNICALL Java_com_flashlight_jni_OnOffFlashlight_offFlashlight
(JNIEnv *, jobject)
{
  write_int(TORCH_LED_FILE, 0);
}


3.编译c文件
编写Android.mk文件用于编译如上提到的两个c文件,主要是声明要编译的源码文件和将要生成的模块名称。范例如下:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_C_INCLUDES := $(JNI_H_INCLUDE)
LOCAL_SRC_FILES:= \
com_flashlight_jni_OnOffFlashlight.cpp
LOCAL_SHARED_LIBRARIES := libutils
LOCAL_PRELINK_MODULE := false
LOCAL_MODULE := liblight
include $(BUILD_SHARED_LIBRARY)

将c文件和Android.mk放入同一文件夹中,本例放入新建的jni目录,再将jni放入手电筒工程根目录。

4.编写用于编译Android工程的Android.mk
范例如下:
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_PACKAGE_NAME := flashlight
# LOCAL_SDK_VERSION := current
include $(BUILD_PACKAGE)
# Use the folloing include to make our test apk.
include $(call all-makefiles-under,$(LOCAL_PATH))

5.将手电筒工程放入源码中编译
将Rflashlight文件夹放入packages/apps/,Rflashlight下有jni、res、src、Android.mk以及AndroidManifest.xml。
输入:
Source /etc/android.conf
./mk g3 r
编译结束后可以在out /target/product /lee/system/lib目录下找到flshlight.so。将其拷出来,在cmd中 运行:adb remount ; adb push flashlight.so /system/lib/ ; 将so文件拷入单板的nand中。

至此jni库已经安装完,可以运行相应的apk了。

6.编译手电筒的整个Android工程
我将Rflashlight放到packages/apps目录下,写了相应的Android.mk文件,内容如下:
# lee
LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := optional

LOCAL_SRC_FILES := $(call all-java-files-under, src)

LOCAL_MODULE := Rflashlight

include $(BUILD_STATIC_JAVA_LIBRARY)
       
LOCAL_PACKAGE_NAME := Rflashlight

LOCAL_CERTIFICATE := platform

include $(BUILD_PACKAGE)

include $(call all-makefiles-under,$(LOCAL_PATH))


这个文件放到ubuntu上居然有些问题,搞了很久,编译多次。之前几次编译通过了,产生了so文件,但没有生成apk。怀疑是手电筒根目录下的Android.mk没写好。直到现在仍然在编译。

你可能感兴趣的:(android)