整个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 534转发别人的代码 -
播放raw中的音乐范例
2013-03-05 16:09 917package cn.test.lee; impor ... -
创建可访问https的client
2012-05-23 09:54 939import java.io.IOException; ... -
android中将读回的xml inputstream打印为日志
2012-05-21 10:40 2573if(StringUtils.IsShowLog) ... -
将保存的文件读为bitmap
2012-05-21 10:38 1075private boolean getSavedPng ... -
将bitmap保存为文件
2012-05-21 10:37 810private void saveBmpToSd(Bi ... -
安装apk的函数
2012-04-12 13:04 940private void installApk(){ ... -
读取存储卡剩余空间
2012-01-06 21:37 742void readSDCard() { String st ... -
向Eclipse导入linux编译生成的jar包,调试android原生app
2012-01-06 11:01 4099Android 系统应用程序 Eclipse 开 ... -
转载---AIDL代理模式讲解图
2011-12-08 20:02 784goi -
监听电话的receiver片段
2011-11-24 12:05 740public class PhoneStatRecei ... -
转载---AIDL
2011-11-14 16:29 871欢迎阅读本文,你能关注本文,你知道你需要进程间通信、 ... -
Android系统应用程序Eclipse开发环境的搭建
2011-11-09 19:19 1<!-- [if !mso]> <styl ... -
转发---Android DRM
2011-11-09 19:17 1188简而言之,DRM系统提供一套机制对用户使用手机上的媒体内容(如 ... -
android 编译单独模块的命令
2011-10-20 19:47 1<!-- [if !mso]> <styl ... -
不匀速移动的Animaiton实例XML
2011-10-20 10:16 856<?xml version="1.0" ... -
截取屏幕图像返回Bitmap的函数
2011-10-20 10:14 1729Handler mMyHandler = new Ha ... -
光影魔术手--不失真压缩图片的方法
2011-08-31 12:51 6438光影魔术手--不失真压缩图片的方法 “光影魔术手(nEO i ...
相关推荐
Android JNI 断点调试C++,一个简单测试,方便初学者入门NDK环境搭建和java调用c++并调试
jni环境搭建到demo
android jni例程,主要是环境的配置,在android studio2.3.3调试通过
VisualGDB调试Android JNI和Linux项目。详细的介绍了如何使用Visual GDB调试Android JNI项目和Linux项目。由于某些原因,图中部分内容被抹掉。敬请见谅。
主要介绍了Android jni调试打印char阵列的实例详解的相关资料,通过此文希望能帮助到大家实现这样的功能,需要的朋友可以参考下
NULL 博文链接:https://mysuperbaby.iteye.com/blog/938791
VS2015 Android JNI 静态库 动态库 APK 本地调试DEMO 自己摸索出来的,10分绝对不高.摆脱Android Studio摆脱Eclipse.摆脱VisualGDB 祝君工作愉悦
在支持C/C++的android程序中添加自己类的native方法,以及不同怎么生成多个so库
众所周知,断点调试是一个合格程序员必备的一种技能,断点调试可以帮助我们查看程序运行期间每一步各变量的值,学会调试可以帮我们节省很多排查问题的时间,下面我们将来介绍一下Android Studio调试的方法和技巧。...
jni 调试在c语言层调用java层的函数输出c中的信息,便于调试
android jni 调试 小案例,,适合初学者 ,参考 案例
android jni调试,分析代码,用来熟悉java和C/C++相互调用问题。
尽管Android Studio已经越来越流行了,但很多人还是习惯于Eclipse或源码环境下开发JNI应用。个人认为使用Android Studio作NDK开发是必然趋势,所以本文将简单介绍...使用这个工具可以很方便的编写和调试JNI的代码。 ND
2. JNI开发环境搭建:讲解了如何配置JNI开发环境,包括编译工具、调试工具等。 3. Java与C/C++的交互:详细阐述了如何在Java代码中调用C/C++编写的本地方法,以及在C/C++中回调Java方法的具体实现。 4. 本地代码的...
NULL 博文链接:https://cherishlc.iteye.com/blog/1756762
2.调试... 76 3.其他信息... 79 Chap11:如何在C/C++中调用Java. 80 1.环境搭建... 81 2.初始化虚拟机... 83 3.访问类方法... 85 4访问类属性... 87 5.访问构造函数... 88 6.数组处理... 89 7.中文处理... ...
对于涉及到C/C++代码的开发,例如JNI开发和安全相关开发,更加建议在Android源代码开发环境进行,这样就可以利用gdb以及gdbclient工具进行调试。这个PPT主要讲Android源代码下载、编译和运行,以及C/C++、Java代码的...
jni测试demo。Android基础demo 用来调试jni
android中得JNI解析,介绍JNI详细介绍文案,什么是JNI,如何使用JNI,为什么有Jni,JNI 用GDB调试技术。