整个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没写好。直到现在仍然在编译。
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没写好。直到现在仍然在编译。
发表评论
-
下拉刷新的代码--转发
2013-11-19 14:18 569转发别人的代码 -
播放raw中的音乐范例
2013-03-05 16:09 946package cn.test.lee; impor ... -
创建可访问https的client
2012-05-23 09:54 973import java.io.IOException; ... -
android中将读回的xml inputstream打印为日志
2012-05-21 10:40 2600if(StringUtils.IsShowLog) ... -
将保存的文件读为bitmap
2012-05-21 10:38 1100private boolean getSavedPng ... -
将bitmap保存为文件
2012-05-21 10:37 840private void saveBmpToSd(Bi ... -
安装apk的函数
2012-04-12 13:04 968private void installApk(){ ... -
读取存储卡剩余空间
2012-01-06 21:37 764void readSDCard() { String st ... -
向Eclipse导入linux编译生成的jar包,调试android原生app
2012-01-06 11:01 4132Android 系统应用程序 Eclipse 开 ... -
转载---AIDL代理模式讲解图
2011-12-08 20:02 808goi -
监听电话的receiver片段
2011-11-24 12:05 767public class PhoneStatRecei ... -
转载---AIDL
2011-11-14 16:29 896欢迎阅读本文,你能关注本文,你知道你需要进程间通信、 ... -
Android系统应用程序Eclipse开发环境的搭建
2011-11-09 19:19 1<!-- [if !mso]> <styl ... -
转发---Android DRM
2011-11-09 19:17 1204简而言之,DRM系统提供一套机制对用户使用手机上的媒体内容(如 ... -
android 编译单独模块的命令
2011-10-20 19:47 1<!-- [if !mso]> <styl ... -
不匀速移动的Animaiton实例XML
2011-10-20 10:16 875<?xml version="1.0" ... -
截取屏幕图像返回Bitmap的函数
2011-10-20 10:14 1751Handler mMyHandler = new Ha ... -
光影魔术手--不失真压缩图片的方法
2011-08-31 12:51 6494光影魔术手--不失真压缩图片的方法 “光影魔术手(nEO i ...
相关推荐
2. 在Android Studio中,启用调试模式,选择目标设备或模拟器,确保它支持JNI调试。 调试步骤: 1. 在C++代码中设置断点。 2. 在Android Studio中运行应用,当执行到本地方法时,调试会暂停在C++断点处。 3. 使用...
标题中的“[转]好消息,android平台从froyo 2.2开始支持jni单步调试了”揭示了一个重要的更新,即从Android Froyo (2.2)版本开始,开发者可以利用Java Native Interface (JNI)进行单步调试。这是一个重大的进步,...
`serial_jni_largestgle_Androidjni_Android串口操作JNI代码_android_`这个项目就是关于如何使用JNI来实现Android设备的串口读写的示例。 首先,我们需要了解JNI的概念。JNI是Java平台提供的一种接口,允许Java代码...
本项目“android jni调用demo”是一个实际操作的例子,它提供了在Android Studio环境中运行的完整流程。 首先,我们需要理解JNI的基本概念。JNI是Java平台的一部分,允许Java代码与其他编程语言(如C/C++)进行通信...
10. **调试与测试**:在开发过程中,开发者可能需要使用NDK工具链进行编译和调试。同时,由于涉及到系统级别的操作,测试应在真机上进行,模拟器可能无法完全模拟真实环境。 综上所述,“android jni 屏幕截图 ...
- 在Android系统中,JNI接口是通过NDK(Native Development Kit)提供的,它是一组工具,用于构建和调试本地库。 2. **创建JNI工程**: - 创建一个新的Android Studio项目,选择包含C++支持的模板。 - 在项目的`...
5. **日志记录**:当JNI抛出异常时,记录详细的日志信息有助于调试,可以使用`__android_log_print()`函数输出日志。 6. **捕获和处理本地异常**:虽然JNI不直接支持try-catch,但可以通过在本地代码中设置错误标志...
同时,`__android_log_print`用于在Android日志系统中输出调试信息。 最后,通过NDK工具链编译C代码为.so动态链接库,然后将.so文件放置到Android项目的`jniLibs`目录下,以便在运行时被Java代码加载。 总结起来,...
描述提到"实现了C语言与java端之间互相传递汉字的功能",这意味着这个示例项目包含了一个完整的解决方案,演示了如何在两端进行正确编码和解码,以确保中文字符在转换过程中不被破坏。通常,这会涉及到Java的`String...
Android Studio提供了对JNI的调试支持,可以通过设置断点、查看变量值等来帮助调试。 9. **总结**:这个教程资料“Android--JNI-Device.zip”对于希望深入了解Android硬件驱动开发的开发者来说非常有价值,它将帮助...
在Android平台上,JNI (Java Native Interface) 是一种技术,它允许Java代码和其他语言写的代码进行交互。本项目涉及的是使用JNI和C++来处理视频,尤其是将FFmpeg解码后的视频帧渲染到Android的Surface上,这对于...
4. **实现过程**:创建一个JNI函数库,定义Java层的接口,并在本地代码中实现I2C的初始化、发送数据、接收数据等功能。在Android应用中,通过Java层的接口调用这些本地函数,完成与I2C设备的通信。 5. **开发环境**...
开发者可以使用 JNI 来实现一些特殊的功能,例如 native 代码的调试、性能优化等。 Android JNI 是一个功能强大且复杂的接口,它提供了多种实现方式和数据结构。开发者可以根据不同的需求和场景选择合适的实现方式...
- 调试JNI代码通常较为困难,因为需要在设备或模拟器上运行,并可能涉及系统日志(Logcat)和调试器(如NDK-GDB)的使用。 - 性能优化:虽然JNI提供了直接访问硬件的便利,但频繁的JNI调用会增加系统开销,因此应...
"Android JNI 调试打印 char 数组的实例详解" Android JNI 调试打印 char 数组的实例详解是 Android 开发中的一种常见需求,特别是在 debug 和测试阶段。在 Android 中,使用 JNI 调用 native 方法时,需要将 char...
为了简化这个过程,我们可以创建一个特定的日志工具类,就像“Android JNI日志工具类”所描述的那样。 这个工具类的目标是消除每次需要打印日志时都要手动编写`android_print_info`的繁琐工作。通常,`android_...
Android NDK(Native Development Kit)是一套工具,提供了编译、构建、调试本地代码的功能,使得开发者可以在Android应用中使用JNI技术。 八、Android Studio与JNI集成 现代Android开发中,大部分开发者使用...
9. **调试和测试**:在开发过程中,可以使用Android Studio的NDK调试工具,以及Android设备上的logcat来跟踪和调试C/C++代码。 10. **打包与部署**:最后,将生成的.so库文件和Java代码打包到APK中,确保目标设备...
本资源包含了Android JNI的学习文档和参考代码,帮助开发者理解和实践JNI的开发过程。 1. **环境搭建**: 在开始Android JNI开发前,首先需要搭建好开发环境。这包括安装Android Studio,配置NDK(Native ...