NDK动态库的调用
来源:互联网 发布:管家婆数据库修复工具 编辑:程序博客网 时间:2024/06/04 08:18
NDK动态库的调用分两种情况。第一种是:so库和调用程序在同一个目录和源程序通过同一个mk文件来编译;另外一种情况是so是外部已经编译好了的,调用程序加载调用。下面我们就来分析下面2种so的调用情况:
第一部分: 内部so调用
package com.example.test;
import android.R.integer;
import android.app.Activity;
import android.widget.TextView;
import android.os.Bundle;
public class test01 extends Activity
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
TextView tv = new TextView(this);
int a = getinformation();
String lls = a +"";
tv.setText(lls);
setContentView(tv);
}
public native int getinformation();
static {
System.loadLibrary("test");
}
}
LOCAL_PATH := $(call my-dir)
#获取当前目录
include $(CLEAR_VARS)
#清除一些变量
LOCAL_MODULE := tutorial
#要生成的库名
LOCAL_SRC_FILES := tutorial01.c tutorial02.c
#库对应的源文件
include $(BUILD_SHARED_LIBRARY)
#生成动态库libtutorial.so
include $(CLEAR_VARS)
#清除一些变量
LOCAL_MODULE := test
#定义另外一个库的名
LOCAL_SRC_FILES := test01.c
#定义库对应的源文件
LOCAL_LDLIBS := -ldl -llog
#libtest.so需要引用的库libdl.so:加载动态函数需要,liblog.so 日志打印需要,默认是system/lib目录下
include $(BUILD_SHARED_LIBRARY)
#生成共享库
#include <string.h>
#include <jni.h>
#include <dlfcn.h>
#include <android/log.h>
#include <stdlib.h>
#define LOG_TAG "libgl2jni"
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)
//extern int getinformation();
jint Java_com_example_test_test01_getinformation(JNIEnv* env,jobject thiz)
{
//getinformation(); ??thr .so file will load to the sdcard with the folder data/data/com.example.test/lib/
void* filehandle = dlopen("/data/data/com.example.test/lib/libtutorial.so", RTLD_LAZY );
int ll = -1;
if(filehandle)
{
LOGI("open so success!");
int( * getinformation ) ();
getinformation = dlsym(filehandle, "getinformation");
if( getinformation )
{
LOGI("call function getinformation OK!");
ll = getinformation();
}
else
{
ll = -3;
LOGE("call function getinformation! ERROR!");
}
LOGI("return value=%d",ll);
dlclose(filehandle);
filehandle=0;
}
else
{
ll = -2;
LOGE("open so ERROR!");
}
return ll;
}
#include <stdio.h>
#include "tutorial02.h"
int getinformation()
{
int c = getinformation2(191,81);
return c;
}
#include <stdio.h>
#include "tutorial02.h"
int getinformation2(int i,int j)
{
return (i+j);
}
int getinformation2(int,int);
C: 编译:
/cygdrive/e/cygwin/android-ndk-r4
Compile thumb : test <= /cygdrive/e/cygwin/android-ndk-r4/samples/testappso/jni/test01.c
SharedLibrary : libtest.so
Install : libtest.so => /cygdrive/e/cygwin/android-ndk-r4/samples/testappso/libs/armeabi
Compile thumb : tutorial <= /cygdrive/e/cygwin/android-ndk-r4/samples/testappso/jni/tutorial01.c
Compile thumb : tutorial <= /cygdrive/e/cygwin/android-ndk-r4/samples/testappso/jni/tutorial02.c
SharedLibrary : libtutorial.so
Install : libtutorial.so => /cygdrive/e/cygwin/android-ndk-r4/samples/testappso/libs/armeabi
D:在重新刷新工程,你就可以在lib下面看到生成的so了,点击加载运行
第二部分:调用通过自己编写make方式生成的so
CC = /cygdrive/e/cygwin/android-ndk-r4/build/prebuilt/windows/arm-eabi-4.4.0/bin/arm-eabi-gcc-4.4.0
CFLAGS = -g -O2 -fPIC -I/cygdrive/e/cygwin/android-ndk-r4/build/platforms/android-5/arch-arm/usr/include
SDFLAGS = -nostdlib -Wl,-T,armelf.xsc -Wl,-shared,-Bsymbolic -Wl,-soname,$@ -lc
CRT_OBJS= -L/cygdrive/e/cygwin/android-ndk-r4/build/platforms/android-5/arch-arm/usr/lib -lz -lm -ldl
# source files:
SRCS= tutorial01.c tutorial02.c tutorial02.h
all: libtutorial.so
libtutorial.so: tutorial01.o tutorial02.o
$(CC) $(SDFLAGS) -o $@ tutorial01.o tutorial02.o $(CRT_OBJS)
tutorial01.o: tutorial02.h
tutorial02.o: tutorial02.h
clean:
rm -f libtutorial.so *.o
在执行make的时候需要注意一下几点:
1.
2.
3.
4.
完成上面的工作你就可以放心make了,成功后生成libtutorial.so文件
CC = /cygdrive/e/cygwin/android-ndk-r4/build/prebuilt/windows/arm-eabi-4.4.0/bin/arm-eabi-gcc-4.4.0
CFLAGS = -g -O2 -fPIC -I/cygdrive/e/cygwin/android-ndk-r4/build/platforms/android-5/arch-arm/usr/include
SDFLAGS = -nostdlib -Wl,-T,armelf.xsc -Wl,-shared,-Bsymbolic -Wl,-soname,$@ -lc
CRT_OBJS= -L/cygdrive/e/cygwin/android-ndk-r4/build/platforms/android-5/arch-arm/usr/lib -lz -lm -ldl
# source files:
SRCS= test01.c
all: libtest.so
libtest.so: test01.o
$(CC) $(SDFLAGS) -o $@ test01.o $(CRT_OBJS)
test01.o: test01.c
clean:
rm -f libtest.so *.o
B. 生成so文件后,在工程目录下建立目录libs/armeabi,然后把so拷贝进去,在打开工程,刷新加载,一切搞定
C.
$ nm libtutorial.so |grep T
00001344 a _GLOBAL_OFFSET_TABLE_
000002a8 T getinformation
000002b4 T getinformation2
D.
cc=/home/zhangweia/android/android-ndk-r4b/build/prebuilt/linux-x86/arm-eabi-4.4.0/bin/arm-eabi-gcc-4.4.0
CFLAGS = -g -O2 -fPIC -DANDROID -I./include -I/home/zhangweia/android/android-ndk-r4b/build/platforms/android-5/arch-arm/usr/include
CFLAGS += -I$(SDK)/out/target/product/generic/obj/include/libpv \
-I$(opencore)/codecs_v2/common/include \
-I$(opencore)/pvmi/pvmf/include \
-I$(opencore)/nodes/common/include \
-I$(opencore)/extern_libs_v2/khronos/openmax/include \
-I$(opencore)/build_config/opencore_dynamic \
-I$(opencore)/android/drm/oma1/src \
-I$(opencore)/engines/author/include \
-I$(opencore)/oscl/oscl/config/shared \
-I$(opencore)/oscl/oscl/config/android \
-I$(opencore)/engines/common/include \
-I$(opencore)/extern_libs_v2/khronos/openmax/include \
-I$(opencore)/android \
#SDFLAGS = -nostdlib -Wl,-T,armelf.xsc -Wl,-shared,-Bsymbolic -Wl,-soname,$@ -lc
SDFLAGS = -nostdlib -Wl,-T,armelf.xsc -Wl,-Bsymbolic -Wl,-soname,$@ -lc
CRT_OBJS=-L/home/zhangweia/android/android-ndk-r4b/build/platforms/android-5/arch-arm/usr/lib -lz -lm -ldl
#all : libomxde.so
OBJECT= omx_threadsafe_callbacks.o \
omxdectest.o \
omxdectestbase.o \
omxtest_buffer_busy.o \
omxtest_corrupt_nal.o \
omxtest_dynamic_reconfig.o \
omxtest_eos_missing.o \
omxtest_extra_partialframes.o \
omxtest_flush_eos.o \
omxtest_flush_port.o \
omxtest_get_role.o \
omxtest_incomplete_nal.o \
omxtest_missing_nal.o \
omxtest_multiple_instance.o \
omxtest_param_negotiation.o \
omxtest_partialframes.o \
omxtest_pause_resume.o \
omxtest_portreconfig_transit_1.o \
omxtest_portreconfig_transit_2.o \
omxtest_portreconfig_transit_3.o \
omxtest_reposition.o \
omxtest_usebuffer.o \
omxtest_without_marker.o
#libomxde.so : $(OBJECT)
omxde : $(OBJECT)
$(cc) $(SDFLAGS) -o $@ $(CRT_OBJS)
omx_threadsafe_callbacks.o:src/omx_threadsafe_callbacks.cpp
$(cc) $(CFLAGS) $(SDFLAGS) -c src/omx_threadsafe_callbacks.cpp
omxdectest.o:src/omxdectest.cpp
$(cc) $(CFLAGS) $(SDFLAGS) -c src/omxdectest.cpp
omxdectestbase.o:src/omxdectestbase.cpp
$(cc) $(CFLAGS) $(SDFLAGS) -c src/omxdectestbase.cpp
omxtest_corrupt_nal.o:src/omxtest_corrupt_nal.cpp
$(cc) $(CFLAGS) $(SDFLAGS) -c src/omxtest_corrupt_nal.cpp
omxtest_buffer_busy.o:src/omxtest_buffer_busy.cpp
$(cc) $(CFLAGS) $(SDFLAGS) -c src/omxtest_buffer_busy.cpp
omxtest_dynamic_reconfig.o:src/omxtest_dynamic_reconfig.cpp
$(cc) $(CFLAGS) $(SDFLAGS) -c src/omxtest_dynamic_reconfig.cpp
omxtest_eos_missing.o:src/omxtest_eos_missing.cpp
$(cc) $(CFLAGS) $(SDFLAGS) -c src/omxtest_eos_missing.cpp
omxtest_extra_partialframes.o:src/omxtest_extra_partialframes.cpp
$(cc) $(CFLAGS) $(SDFLAGS) -c src/omxtest_extra_partialframes.cpp
omxtest_flush_eos.o:src/omxtest_flush_eos.cpp
$(cc) $(CFLAGS) $(SDFLAGS) -c src/omxtest_flush_eos.cpp
omxtest_flush_port.o:src/omxtest_flush_port.cpp
$(cc) $(CFLAGS) $(SDFLAGS) -c src/omxtest_flush_port.cpp
omxtest_get_role.o:src/omxtest_get_role.cpp
$(cc) $(CFLAGS) $(SDFLAGS) -c src/omxtest_get_role.cpp
omxtest_incomplete_nal.o:src/omxtest_incomplete_nal.cpp
$(cc) $(CFLAGS) $(SDFLAGS) -c src/omxtest_incomplete_nal.cpp
omxtest_missing_nal.o:src/omxtest_missing_nal.cpp
$(cc) $(CFLAGS) $(SDFLAGS) -c src/omxtest_missing_nal.cpp
omxtest_multiple_instance.o:src/omxtest_multiple_instance.cpp
$(cc) $(CFLAGS) $(SDFLAGS) -c src/omxtest_multiple_instance.cpp
omxtest_param_negotiation.o:src/omxtest_param_negotiation.cpp
$(cc) $(CFLAGS) $(SDFLAGS) -c src/omxtest_param_negotiation.cpp
omxtest_partialframes.o:src/omxtest_partialframes.cpp
$(cc) $(CFLAGS) $(SDFLAGS) -c src/omxtest_partialframes.cpp
omxtest_pause_resume.o:src/omxtest_pause_resume.cpp
$(cc) $(CFLAGS) $(SDFLAGS) -c src/omxtest_pause_resume.cpp
omxtest_portreconfig_transit_1.o:src/omxtest_portreconfig_transit_1.cpp
$(cc) $(CFLAGS) $(SDFLAGS) -c src/omxtest_portreconfig_transit_1.cpp
omxtest_portreconfig_transit_2.o:src/omxtest_portreconfig_transit_2.cpp
$(cc) $(CFLAGS) $(SDFLAGS) -c src/omxtest_portreconfig_transit_1.cpp
omxtest_portreconfig_transit_3.o:src/omxtest_portreconfig_transit_3.cpp
$(cc) $(CFLAGS) $(SDFLAGS) -c src/omxtest_portreconfig_transit_1.cpp
omxtest_reposition.o:src/omxtest_reposition.cpp
$(cc) $(CFLAGS) $(SDFLAGS) -c src/omxtest_reposition.cpp
omxtest_usebuffer.o:src/omxtest_usebuffer.cpp
$(cc) $(CFLAGS) $(SDFLAGS) -c src/omxtest_usebuffer.cpp
omxtest_without_marker.o:src/omxtest_without_marker.cpp
$(cc) $(CFLAGS) $(SDFLAGS) -c src/omxtest_without_marker.cpp
clean:
rm -rf *.o
- NDK动态库的调用
- NDK动态库的调用
- NDK动态库的调用
- Android-ndk 调用现有的动态库
- NDK动态链接库的编译和调用
- 关于Android NDK中调用第三方的动态库
- 关于Android NDK中调用第三方的动态库
- 关于Android NDK中调用第三方的动态库
- 关于Android NDK中调用第三方的动态库
- 关于Android NDK中调用第三方的动态库
- 关于Android NDK中调用第三方的动态库
- NDK中, 如何调用系统级的私有动态库
- 关于Android NDK中调用第三方的动态库
- Android NDK中调用第三方的动态库
- 用NDK调用第三方动态库
- 关于NDK动态链接库中调用动态链接库一种错误的解决办法
- NDK 动态库 调用第三方动态库
- NDK学习(3) 动态库的编译与在动态库中调用编译的动态库
- kernel module编程(六):printk-…
- 一次AIX6.1 +oracle11gR2 User not found in /etc/passwd file的解决方法
- 在 Linux 平台下使用 JNI
- 在 Linux 平台下使用 JNI
- NDK动态库的调用
- NDK动态库的调用
- 内核模块加载 及模块Makefile编写
- 内核模块加载 及模块Makefile编写
- adb通过TCP/IP来调试Android设备
- adb通过TCP/IP来调试Android设备
- android调试工具adb (转载)
- android调试工具adb (转载)
- 对标准库string对象赋值的问题
- Android 调试桥(adb)是多种用途的…