`
izuoyan
  • 浏览: 9220476 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

使用jni接口完成android本地程序的运行

阅读更多

最近在开发android相关的程序。可惜啊,android的开发接口都是基于java的,作为一个c开发者,于是我想开发一个c程序,然后想法root掉那个手机,然后使用adb工具将程序拷贝到手机里就可以运行了...想法很好,但是有两个问题,第一,靠点击根本无法运行本地程序;第二,如果程序发布,难道能指望用户将手机寄过来然后帮他们root吗?于是这个方法直接pass掉了。
接下来,想把程序打包到一个基于java的apk中,安装的时候直接将程序复制到和apk相同的目录下,然后由java程序使用exec调用这个本地程序。实验证明,由于权限问题,不可行!后来又想将程序通过apk直接复制到SD卡上,但是通过查看android的源代码发现,SD卡被mount的时候是指定了noexec标志的,也就是说SD卡上的程序无法执行(这是有道理的,因为如果sd卡的程序可以执行的话,随便一个溢出漏洞就可能危害系统...再说,sd卡耗电,又不稳定)...于是,没有办法了!难道在android上开发程序必须用java吗?其实不是这样的!虽然接口是java,但是java明确规定了又jni接口可以调用本地程序的,如此看来,既然java对于android是被信任的,那么使用java的jni调用的本地程序也是被信任的(虽然java虚拟机并不管理它,但是它确实没有任何管理者监管啊),于是就想办法将要执行的本地程序封装成一个so(动态库),然后用java的loadlibrary执行之。
以ABC c语言编写的程序为例,下面的步骤搞定了它,这里仅仅用java SE作为例子,没有使用android的sdk/ndk,然而其工作原理是一样:
1.首先写一个java程序,很简单的:Test.java
class Test
{
public native void jni_main();
static {
System.loadLibrary("abc");
}
public static void main(String[] args) {
new Test().jni_main();
}
}
2.生成头文件:
javah Test
生成Test.h
3.将Test.h复制到ABC的源码目录下
4.想办法将abc编译成libabcd.so(其实ABC本来在linux平台被编译成一个elf可执行文件的,这里要把它编译成so,用于java程序的jni接口加载)
4.1.修改abc.c,如下:
//int main(int argc, char* argv[]) { //原来的main函数
JNIEXPORT void JNICALL Java_TestABC_Wrapper_1main (JNIEnv *env, jobject obj) { //修改后的jni接口调用的main函数
...
}
4.2.编写Makefile文件:
#开始
CC := droid-gcc
LD := droid-ld
DEFS = ...#复制原来的Makefile的该字段
LIBS = ...#复制原来的Makefile的该字段
CFLAGS := ...(复制原来Makefile的该CFLAGS) -I...#复制和android相关的头文件的路径
LDFLAGS := -shared -fpic
SOURCE := $(wildcard *.c)
OBJS := $(patsubst %.c,%.o,$(SOURCE))
TARGET_LIB := libabc.so
all:$(OBJS)
$(LD) $(LDFLAGS) -o $(TARGET_LIB) $(OBJS) $(LIBS)
%.o:%.c
$(CC) -c $(CFLAGS) $< -o $*.o
*.o -rf
#结束
5.编译,执行make,最终生成一个so,然后运行java Test,结果是abc被运行啦!
PS:我认为,google的android仅仅用java作为其主流开发语言,这是不妥的,这样就使得很多厂商望而却步,很多做c的人望而却步,本来android的用户就没有symbian的多,现在由于这个原因,更使得它只能在众多hacker圈子里打转,一般的手机用户是不懂什么linux的,也不关心什么root权限,因此很多hacker方略对于一般的用户是没有意义的,他们关心的最终的体验,因此很多的任务不得不压在开发者身上,开发者越多就意味着潜在用户越多,symbian走的就是这条路线,palm当初也许就是因为没有走这个路线而失败的。因此,不管怎么多,平台提供者不应该限制开发者,开放的越多,应用就会越多,众口难调的用户才会易于伺候。

分享到:
评论

相关推荐

    Android应用程序使用JNI调用驱动程序

    5. **在Java中调用JNI**:在Android应用程序运行时,通过`System.loadLibrary("mylibrary")`加载.so库,然后就可以调用之前定义的`callDriver()`方法。 以《Android内核源代码情景分析》第二章的freg实例为例,freg...

    Qt调用Jni接口获取Android相册图片列表

    在开发跨平台应用程序时,Qt框架提供了一个强大的工具集,允许开发者使用C++编写代码,同时能在多个操作系统上运行,包括Android。而Android系统中的一些原生功能,如访问相册图片,通常需要通过Java语言来实现。...

    Android--JNI-Device.zip_Android jni_android_jni_jni android

    5. **Android JNI Device.doc内容推测**:这份文档很可能详细介绍了如何创建和使用JNI接口来与特定的Android设备驱动进行通信。可能包括了创建本地方法、处理设备I/O、错误处理、同步机制等内容。 6. **性能优化**...

    Android使用JNI调用Python so解释器

    总结来说,"Android使用JNI调用Python so解释器"涉及到Android NDK开发,JNI接口设计,Python解释器的Android移植,以及跨语言通信等多个技术层面。这种技术虽然复杂,但能充分利用Python的灵活性和Android的广泛...

    Android Studio jni 程序

    要在Android Studio中引入JNI程序,你需要在Java代码中声明本地方法。例如,你可以在一个类中定义一个native关键字修饰的方法: ```java public class MainActivity extends AppCompatActivity { static { System...

    android通过JNI访问硬件LED

    由于Android的Dalvik/ART虚拟机支持JNI,所以开发者可以创建本地库,然后在Android应用中通过JNI接口调用。 3. **访问硬件LED**: LED控制通常涉及到低级的I/O操作,这在Java层通常是不可能或者效率低下的。通过...

    android下JNI使用方法

    Android下的JNI(Java Native Interface)是一种允许Java代码与其他语言(如C、C++)交互的技术。JNI是Java 2 SDK的一部分,...NDK支持预编译的库,以及通过JNI接口与Java代码交互,有助于提高性能和实现特定平台功能。

    Android JNI 用C函数写本地库读写文件,底层调用小例子

    JNI是Android提供的一种接口,使得Java应用程序可以调用C/C++编写的原生代码。这在需要高性能计算、访问硬件特性或利用已有的C库时特别有用。JNI的核心在于`JNIEnv`指针,它是Java虚拟机与本地代码之间的桥梁,提供...

    android 使用jni调用c++

    NDK是一组工具,开发者可以用它来编写用C和C++编写的应用程序模块,这些模块可以直接在Android设备上运行。安装NDK后,确保将其路径添加到系统的环境变量中,以便在命令行中能够访问。如果你遇到配置问题,建议查阅...

    Android JNI使用demo

    - 在Android系统中,JNI接口是通过NDK(Native Development Kit)提供的,它是一组工具,用于构建和调试本地库。 2. **创建JNI工程**: - 创建一个新的Android Studio项目,选择包含C++支持的模板。 - 在项目的`...

    android jni 屏幕截图 NativeScreenCapture

    1. **JNI基础**:JNI是Android平台上的一个接口,它为Java应用程序提供了一个桥梁,使得开发者可以使用C或C++编写部分代码,以提升性能或者利用现有的C/C++库。JNI包括一系列的函数调用,如`JNIEnv`指针,用于在Java...

    最简单的Android JNI程序

    JNI是Java平台的标准接口,它为Java应用程序提供了调用本地方法的能力。在Android系统中,JNI主要用来桥接Java层与C/C++层,使得开发者可以充分利用C/C++的强大性能和灵活性。 二、创建JNI项目 一个简单的Android ...

    hello-jni.rar_ android jni_android hello jni_android jni hellojn

    JNI接口定义了一系列函数,使得Java代码能够调用本地方法,反之亦然。在Android中,JNI被广泛用于调用C/C++库,实现高性能的计算或图形处理。 三、Hello-JNI项目解析 "hello-jni"是学习JNI开发的经典入门案例,它...

    android--JNI.zip_android_android 驱动_jni_jni android

    JNI允许开发者在Android应用中调用本地方法,从而利用C和C++的强大性能和库来解决特定问题,比如优化计算密集型任务、使用硬件加速或者调用操作系统级别的功能。 JNI在Android开发中的主要用途包括: 1. **性能...

    Android中JNI测试程序

    总之,Android的JNI测试程序涉及到Java和C/C++之间的交互,这需要理解JNI接口的使用、C++库的编译以及Java层的调用。通过这样的实践,开发者可以更深入地掌握Android系统的底层机制,提升应用程序的性能和功能。

    安卓串口Socket通讯USB驱动jni相关-Android调用JNI的简单实例附详细步骤.zip

    在Android应用中,JNI接口通常包含在Java类中,通过`System.loadLibrary("name")`加载对应的本地库。"name"是编译后的`.so`文件名,不需要包含".so"后缀。 3. **JNI开发流程**: - 定义Java类,声明`native`方法...

    AndroidStudio加载jni

    NDK是一组工具,开发者可以使用它来编写C、C++代码,并将其编译为本地库,这些库可以在Android设备上运行。NDK的主要用途包括性能敏感的计算、游戏引擎、以及使用现有C/C++库。 在Android Studio中配置NDK的步骤...

    android通过jni执行shell命令

    JNI接口为Java应用程序提供了一个桥梁,使其可以直接调用本地(非Java)代码,通常是C/C++编写的库。这涉及到创建一个本地方法接口,在Java代码中声明,然后在对应的C/C++源文件中实现。 在Android中,我们通常会...

    安卓串口Socket通讯USB驱动jni相关-Android通过jni控制LED灯.zip

    可能包含C/C++的源代码,定义了如何通过JNI接口与Java层交互,以及如何操作具体的硬件引脚来控制LED灯的亮灭。 由于描述中提到代码可能需要自行调整才能运行,因此在实际使用这些源码时,开发者需要具备一定的...

    JniDemo Android调用C语言

    这些函数将实现实际的功能,并且需要包含`&lt;jni.h&gt;`头文件以使用JNI接口。 3. **配置CMakeLists.txt**:在Android Studio中,需要在项目的`app`目录下创建一个`CMakeLists.txt`文件,用来指定编译的目标、链接的库等...

Global site tag (gtag.js) - Google Analytics