android JNI的.so库调用

在一篇博客中看到一篇文章,感觉描述的还可以:

在前面的博客中介绍的都是使用java开发Android应用,这篇博客将介绍java通过使用jni调用c语言做开发

为了更加形象的介绍jni,先观察下面的图片,下图表示的是整个android系统架构

图中从上到下的结构依次是:
Application:表示应用层,其实就是指android手机上的应用

Application Framework:表示应用框架层,我们平时用java开发app就是使用应用框架层提供的API做开发

Libraries:android类库,使用C/C++开发的android类库

Android Runtime:android运行环境

Linux Kernel:Linux内核

通过上图可知Android系统分为五个部分,分别是Application(应用层)、Application Framework(应用框架)、Librarise(Android 类库)、Android Runtime(Android 运行环境)、Linux Kernel(Linux内核),且android应用框架使用java开发的,android类库使用c/c++开发的,为了使得java开发应用框架能调用c/c++开发的android类库,android中引入了一个jni,通过jni可以实现java调用c/c++,c/c++调用java

开发jni需要准备的工具:
参考:android NDK的下载-文件太大

Android ndk,Android NDK的下载地址是:http://blog.csdn.net/DJY1992/article/details/51364430

下载完成后将ndk解压的一个任意的目录下,我解压在D:\develop,建议文件目录不要带空格,解压后将ndk所在的路径添加到环境变量中

打开android ndk后,可以看到android ndk的目录结构如下:

android ndk目录结构介绍:

docs:帮助文档

build/tools:linux的批处理文件

platforms:编译c代码需要使用的头文件和类库

prebuilt:预编译使用的二进制可执行文件

sample:jni的使用例子

source:ndk的源码

toolchains:工具链

ndk-build.cmd:编译打包c代码的一个指令

使用ndk实现一个简单的Hello World程序

第一步:使用eclipse创建一个Android工程,并且将工程的名称命名为HelloJni

第二步:修改activity_main.xml文件,在布局上添加一个按钮点击按钮后调用c语言写的代码

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >  

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="调用c语言代码"
        android:onClick="click"/>  

</RelativeLayout>  

第三步:在创建好的android工程下新建一个jni文件夹

第四步:在jni文件夹下新建一个hello.c文件,并在hello.c文件中添加下面的代码

#include <stdio.h>
#include <stdlib.h>
#include <jni.h>  

/***
 * 第一个参数:java虚拟机的内存地址
 * 第二个参数:调用helloFromC方法的java对象
 */
Java_com_example_hellojni_MainActivity_helloFromC(JNIEnv* env, jobject obj) {  

    //创建一个c语言的字符串,并且初始化字符串
    char* arr = "hello world jni !";  

    //把c语言的字符串转换成java的字符串
    jstring jstr = (*env)->NewStringUTF(env, arr);  

    //返回字符串
    return jstr;
}  

第五步:在jni文件夹下新建一个Android.mk文件,并在Android.mk中添加下面的代码

LOCAL_PATH := $(call my-dir)  

   include $(CLEAR_VARS)  

#编译生成的文件的类库叫什么名字
   LOCAL_MODULE    := hello  

   #要编译的c文件
   LOCAL_SRC_FILES := Hello.c  

   include $(BUILD_SHARED_LIBRARY)  

第六步:编译android ndk程序

1、打开命令行,并且进入到jni所在的目录

2、输入ndk-build.cml命令编译android ndk

3、看到下图所示的提示表示android ndk编译成功

4、此时打开libs文件夹下的armeabi文件夹,可以看到armeabi文件夹下生成了一个libhello.so文件

      这个就是Android ndk编译后生成的文件,在后面就可以直接使用libhello.so文件

最后一步:使用通过ndk编译好的,修改MainActivity.java文件


package com.example.hellojni;  

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;  

public class MainActivity extends Activity {  

    static {  

        //加载打包完毕的so类库
        System.loadLibrary("hello");
    }  

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }  

    //调用c语言代码按钮响应函数
    public void click(View view) {  

        //使用吐司对话框显示c语言代码中的函数helloFromC()的返回值
        Toast.makeText(this, helloFromC(), Toast.LENGTH_SHORT).show();
    }  

    //定义一个本地方法,方法体由C语言实现
    public native String helloFromC();
}  



-------------------------------------运行之后的效果------------------------------------------------
运行android程序后手机上会显示下图所示的界面

点击按钮后弹出吐司,并且在吐司中显示"hello world jni !"表示Android成功的调用了c语言开发的jni程序

时间: 2024-09-27 20:16:59

android JNI的.so库调用的相关文章

Android jni编辑.so库

引自:http://www.cnblogs.com/sevenyuan/p/4202759.html 1. 在Eclipse中创建项目:TestJNI 2. 新创建一个class:TestJNI.java package com.wwj.jni; public class TestJNI { public native boolean Init(); public native int Add(int x, int y); public native void Destory(); } 以上代码

Android JNI如何调用第三方库

http://www.2cto.com/kf/201504/388764.html Android JNI找不到第三方库的解决方案 cannot load library 最近做一个jni项目,拿到的so库需要用jni封装一层,等于是在jni的C++代码里调用第三方库的方法,然后整个项目在Android上运行出结果. 自己用jni生成的so是libaa.so 使用的第三方库是libbb.so. 到目前为止,遇到的问题是libbb各种找不到.libbb库去哪儿了? E/AndroidRuntime

【转】 Android的NDK开发(1)————Android JNI简介与调用流程

原文网址:http://blog.csdn.net/conowen/article/details/7521340 ******************************************************************************************** * author:[email protected]大钟                                                                      

android JNI调用(转)

Android jni开发资料--NDK环境搭建 android开发人员注意了 谷歌改良了ndk的开发流程,对于Windows环境下NDK的开发,如果使用的NDK是r7之前的版本,必须要安装Cygwin才能使用NDK.而在NDKr7开始,Google的Windows版的NDK提供了一个ndk-build.cmd的脚本,这样,就可以直接利用这个脚本编译,而不需要使用Cygwin了.只需要为Eclipse Android工程添加一个Builders,而为Eclipse配置的builder,其实就是在

android jni 调用

android JNI是连接android Java部分和C/C++部分的纽带,完整使用JNI需要Java代码和C/C++代码.其中C/C++代码用于生成库文件,Java代码用于引用C /C++库文件以及调用C/C++方法. android Java部分代码: /* * Copyright (C) 2008 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "Licens

android JNI实践之java端调用C\C++

关于android JNI的讲解网络上已经很多了,这里贴出自己的实践步骤,加深印象. 1)编写java代码,并通过javac JniFuncMain.java编译class文件: public class JniFuncMain{ private static int staticIntFiled = 300; static{ System.loadLibrary("jnifunc"); } public static native JniTest createJniObject();

Android JNI 调用 C/C++

Android JNI 调用 C/C++ 接口 Android 使用 NDK 原生支持调用 c/c++ 接口的代码,只需要在程序中按照 android jni 规范编程就可以直接使用. C 语言版本 JNI 调用 c 语言相对简单,命名一个 jni 函数,系统会自动注册到 Java 虚拟机,然后 Java 代码里面可以直接调用: Native 代码: #include <jni.h> int add(int x, int y) { return x + y; } jint Java_com_e

求教,是否直接可以调用android的libmedia.so库进行音频播放

问题描述 问题: 在C++代码中是否可以调用android系统的libmedia.so, 我用C++写了一个测试程序,调用了libmedia.so中mediaplayer.cpp中的方法进行音频播放,可以通过编译,也可以在android系统的机顶盒中执行,但是prepare()方法一直被阻塞,求大神指点该如何解决啊,给点思路好吗?以下是测试代码: #include <stdio.h> #include <stdlib.h> #include <mediaplayer.h>

android JNI调用

android JNI调用,布布扣,bubuko.com