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没写好。直到现在仍然在编译。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值