`
cjblog
  • 浏览: 68679 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

ubuntu android 调用 动态链接库

 
阅读更多

以下开发是在ubuntu12.04进行。

准备开发环境:

1.这里我直接用的android官方提供的IDE。

http://developer.android.com/sdk/index.html

2.android sdk.

环境变量设置:

export ANDROID_HOME=$HOME/download/adt-bundle-linux-x86-20130729/sdk

export ANDROID_NDK_HOME=$HOME/download/android-ndk-r9

export JAVA_HOME=$HOME/jdk1.7.0_25

export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$ANDROID_HOME/platform-tools:$ANDROID_HOME/tools:$ANDROID_NDK_HOME:$PATH

export CLASSPATH=$CLASSPATH:.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib

3.ndk,http://developer.android.com/tools/sdk/ndk/index.html

如图:



 

 创建一个android项目。

layout-->main.xml内容很简单,就一个文本框,展示结果使用:

<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" >

    <TextView
        android:id="@+id/txtView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="124dp"/>

</RelativeLayout>

 现在建立一个类,这个类主要是调用底层c函数的类:

package org.chenjun.jni;

public class JniUtil {

	public native static int getSum(int a,int b);
	
	static{
		System.loadLibrary("jniUtil");//libjniUtil.so
	}
	
}

 只有一个方法,getSum,传递2个数值进行求和操作。通过javah编译出头文件出来。文件内容:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class org_chenjun_jni_JniUtil */

#ifndef _Included_org_chenjun_jni_JniUtil
#define _Included_org_chenjun_jni_JniUtil
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     org_chenjun_jni_JniUtil
 * Method:    getSum
 * Signature: (II)I
 */
JNIEXPORT jint JNICALL Java_org_chenjun_jni_JniUtil_getSum
  (JNIEnv *, jclass, jint, jint);

#ifdef __cplusplus
}
#endif
#endif

 

在android工程下建立jni目录。将该头文件放到jni目录中。jni目录中创建c文件jniUtil.c:

#include <string.h>
#include <jni.h>
#include "org_chenjun_jni_JniUtil.h"

JNIEXPORT jint JNICALL Java_org_chenjun_jni_JniUtil_getSum
  (JNIEnv *env, jclass clazz, jint a, jint b){
	return a + b;
}

jni目录中创建android.mk文件,文件的含义在ndk的doc中有介绍:

# Copyright (C) 2009 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := jniUtil
LOCAL_SRC_FILES := jniUtil.c

include $(BUILD_SHARED_LIBRARY)

 目录结构如下图:



 

使用终端进入到android项目的根目录下面,执行ndk-build命令就会生成我们要的动态链接库:



 在MainActivity中我们调用动态链接库给我们的方法进行计算并展示在文本框中:

package org.chenjun.android.jni;

import org.chenjun.jni.JniUtil;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.TextView;

public class MainActivity extends Activity {
	
	private TextView txtView;
	
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		txtView = (TextView) findViewById(R.id.txtView);
		int c = JniUtil.getSum(2, 6);
		txtView.setText("2+6=" + c);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

}

 运行后的结果如图:



 

 如果紧紧是调用别人提供的动态链接库,之需要把so文件放到libs/armeabi下面,android在调用的时候一定要对应包名和方法名即可。

 附件附带整个工程

 

  • 大小: 47.1 KB
  • 大小: 101.8 KB
  • 大小: 32.1 KB
  • 大小: 89.9 KB
  • 大小: 34.5 KB
0
1
分享到:
评论

相关推荐

    android调用c和c++源代码

    编译完成后,Android Studio会自动生成对应的.so动态链接库文件,这些库文件会被打包进APK中。 除了基本的函数调用,JNI还支持更复杂的数据类型交互,如数组、对象、类等。同时,C++代码可以通过JNI访问Android的...

    curl for android (arm, x86所有平台)下的静态库 ubuntu下编译完成

    同时,由于它是静态库,可以直接链接到你的Android应用中,无需关心动态库的加载问题。 接下来,我们谈谈如何通过Java JNI调用libcurl.a。JNI(Java Native Interface)是Java平台的一部分,允许Java代码和其他语言...

    android平台ffmpeg动态库

    NDK 提供了必要的编译器、链接器和其他工具,允许开发者在非 Android 系统(如 Ubuntu 18.04.1 LTS)上构建针对 Android 设备的代码。 在编译 FFmpeg 时,开发者通常需要进行以下步骤: 1. 配置编译环境:安装 ...

    ffmpeg0.6.1源码和在Android下可用的动态库

    `armeabi`目录可能包含的是针对ARM架构的Android设备编译的动态链接库(.so文件)。armeabi是Android早期版本支持的一种CPU架构,现在大多数低功耗Android设备仍然兼容。编译出的这些.so文件将被集成到Android应用中...

    android jni调用详细解说

    编译C/C++源文件为动态链接库(.so文件),并在Android项目中引用。具体的编译命令取决于所使用的编译器和构建系统。例如,在使用`make`构建系统时,可以通过修改`Application.mk`和`Android.mk`文件来指定编译选项...

    vmware虚拟机 ubuntu中编译的FFmpeg库文件

    5. 生成armeabi-v7a架构的so文件:编译过程中,会生成不同架构的动态链接库(.so文件)。armeabi-v7a是Android针对ARMv7处理器的一个ABI(应用程序二进制接口),适用于大多数现代Android设备。 三、FFmpeg库在...

    ubuntu+android-ndk-r5b+ffmpeg2.7

    1. `libffmpeg.so` 是FFmpeg的核心动态链接库文件,它包含了编译后的库函数,可以在Android应用程序中加载和使用。 2. `lib` 目录可能包含其他支持库或编译后的模块,这些模块可能在FFmpeg的某些功能中被引用。 3. `...

    4.0.2的编译过的ffmpeg全款so for Android

    动态链接库是Android应用可以直接调用的本地代码,它们负责执行底层的音视频处理任务。 使用预编译的FFmpeg .so文件可以简化开发过程,因为开发者不需要自己配置交叉编译环境并编译源代码。这通常涉及到设置NDK...

    android同linux底层通信机制实现

    当在Java代码中定义了一个native方法后,可以通过NDK(Native Development Kit)将对应的C/C++代码编译为动态链接库(.so文件),然后在Java中通过System.loadLibrary加载这个库,从而实现Java与C/C++的交互。...

    java 与Ubuntu为Android增加硬件抽象层(HAL)模块访问

    为了让HAL模块在Android系统中可用,你需要将其编译为动态链接库(`.so`文件),并将其放置在正确的系统目录下,通常是`/system/lib/hw`。同时,设备文件的创建和权限管理可以通过udev规则来完成。在Ubuntu上,你...

    android 移植ffmpeg后so库的使用

    - 编译完成后,会得到一个名为`libffmpeg.so`的动态链接库文件,这是FFmpeg的核心库,包含了音频和视频处理的各种功能。 2. **编译FFMPEG库**: - 使用NDK的交叉编译工具链,配置相应的Android平台、架构和编译...

    Android平台的FFmpeg类库

    将FFmpeg编译为适用于Android的库,就需要利用NDK进行交叉编译,生成.so动态链接库文件,这些文件将被Android应用加载并执行原生代码。 4. **jniLibs目录**: 在Android项目中,编译后的原生库通常被放置在`jni...

    FFmpeg4.4.1 编译android so库包含x264

    在Android平台上,由于原生代码可以提供更好的性能,我们经常需要编译FFmpeg为动态链接库(so库)来使用。在这个过程中,包含x264是一个重要的步骤,因为x264是H.264编码器的实现,广泛应用于视频编码和传输。 ...

    delphi11.3编写so库,及调用实例,linux下运行,Deepin系统so编写调用

    在本实例中,我们将聚焦于如何使用Delphi 11.3在Linux环境下,特别是Deepin操作系统上,创建共享对象库(SO库,即动态链接库)并进行调用。 1. **Delphi 11.3简介** Delphi 11.3是Embarcadero公司推出的一款集成...

    ubuntu下第一个Jni例子

    5. **编译本地代码**:使用NDK的交叉编译工具链,将C代码编译为适用于Android平台的动态链接库(.so文件)。这通常涉及到设置正确的架构(如armeabi-v7a或arm64-v8a)和平台版本。 ```bash ndk-build NDK_PROJECT_...

    Android通过JNI调用驱动程序(完全解析实例)

    - 使用`System.loadLibrary("vib-jni")`加载动态链接库,并调用以上声明的JNI方法。 #### 总结 通过本教程的学习,你可以掌握如何在Android应用中通过JNI技术调用C/C++代码来实现对硬件设备的直接控制。这种技术在...

    编译好ffmpeg so 文件用于安卓

    在安卓平台上,为了实现对多媒体文件如MP4、FLV或网络流的支持,通常需要将FFmpeg编译为动态链接库(so文件),以便在Android应用中调用。在本案例中,我们将在Ubuntu 16.04环境下编译FFmpeg 2020版本,并将其与Qt ...

    android移植ffmpeg后so库的使用.docx

    在Android平台上使用FFmpeg,通常需要进行移植工作,以便将FFmpeg库编译为适用于Android架构的SO动态链接库。本篇文章主要讲述了如何在Android环境下移植FFmpeg并使用其生成的SO库。移植过程分为几个关键步骤: 1. ...

    ffmpeg for Android包含头文件和编译好的so库 可直接使用

    头文件用于编译时的链接,而.so库则是在运行时加载的动态链接库,它们是Android应用与FFmpeg交互的基础。 描述中提到的“ubuntu下编译ffmpeg 2.5.1 包含头文件和so库”,意味着这个FFmpeg版本是在Ubuntu操作系统上...

Global site tag (gtag.js) - Google Analytics