JNI动态库生成、编译、查看相关简易资料
有一篇好博文,大家可以看下http://www.cnblogs.com/zhangweia/archive/2010/09/16/1828176.html,我这里是参考其做的另外一个
javah -classpath ../../NVPACK/android-sdk-linux/platforms/android-19/android.jar:./bin/classes -d jni com.android.imagesrppl.MainActivity
进入工程目录,直接编译头文件的形式,最后com.android.imagesrppl.MainActivity是src文件对应要编译的native函数所在的类文件
../../NVPACK/android-sdk-linux/platforms/android-19/android.jar sdk的路径,根据自己的路径来设置
生成的头文件名字为:com_android_imagesrppl_MainActivity.h com_android_imagesrppl包名字 MainActivity native函数所在的类名字
对应的头文件举例:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class _Included_com_android_imagesrppl_MainActivity */
#ifndef _Included_com_android_imagesrppl_MainActivity
#define _Included_com_android_imagesrppl_MainActivity
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_android_imagesr_MainActivity
* Method: dehaze
* Signature: (II[B[B)V
*/
JNIEXPORT void JNICALL Java_com_android_imagesrppl_MainActivity_cMethod
(JNIEnv *, jobject, jint, jint, jfloat, jint, jint, jbyteArray, jbyteArray, jint);
#ifdef __cplusplus
}
#endif
#endif
对应的C文件举例:
#include <jni.h>
#include <stdio.h>
#include <stdlib.h>
#include "com_android_imagesrppl_MainActivity.h"
#include "./include/ppl/ppl.h"
#include "./include/ppl/image/image.h"
#include <android/log.h>
#define LOG_TAG "JNI"
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
#define uchar unsigned char
void SR_C(int h, int w, float factor, int out_h, int out_w, signed char *data, signed char *dehazeData, int mode) {
method();//so中要调用的方法
}
JNIEXPORT void JNICALL Java_com_android_imagesrppl_MainActivity_cMethod
(JNIEnv *env, jobject obj, jint h, jint w, jfloat factor, jint out_h, jint out_w, jbyteArray data, jbyteArray dehazeData, jint mode) {
LOGI("JNI");
jbyte *cData = env->GetByteArrayElements(data, NULL);
jbyte *cDehazeData = env->GetByteArrayElements(dehazeData, NULL);
SR_C(h, w, factor, out_h, out_w, cData, cDehazeData, mode);
env->ReleaseByteArrayElements(data, cData, NULL);
env->ReleaseByteArrayElements(dehazeData, cDehazeData, NULL);
}
一般在jin目录下建立include和lib,分别存放头文件和库文件;然后在makefile文件中指定对应的目录即可
Android.mk文件举例
LOCAL_PATH := $(call my-dir)
#LOCAL_CFLAGS := -O3 -mfpu=neon -mfloat-abi=hard -mcpu=cortex-a15 -ftree-vectorize -flax-vector-conversions
#arm neon 常用选项
#LOCAL_CXXFLAGS :=-O3 -mfpu=neon -march=armv7 -mfloat-abi=softfp -fPIC -ftree-vectorize -flax-vector-conversions
#LOCAL_CFLAGS :=-O3 -mfpu=neon -march=armv7 -mfloat-abi=softfp -fPIC -ftree-vectorize -flax-vector-conversions
include $(CLEAR_VARS)
LOCAL_MODULE := libppl_common
LOCAL_SRC_FILES := ./lib/libppl_common.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := libppl_image
LOCAL_SRC_FILES := ./lib/libppl_image.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := libcudart_static
LOCAL_LIB_PATH += $(CUDA_TOOLKIT_ROOT)/targets/armv7-linux-androideabi/lib/
LOCAL_SRC_FILES := $(LOCAL_LIB_PATH)/libcudart_static.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := imagesr
MY_PREFIX := $(LOCAL_PATH)/
MY_SOURCES := $(wildcard $(LOCAL_PATH)/*.cpp)
LOCAL_SRC_FILES := $(MY_SOURCES:$(MY_PREFIX)%=%)
LOCAL_CFLAGS +=-DPPL_USE_ARM
LOCAL_STATIC_LIBRARIES := libcudart_static
LOCAL_SHARED_LIBRARIES := libppl_common libppl_image
LOCAL_STATIC_LIBRARIES += nv_and_util nv_egl_util nv_glesutil nv_shader nv_file
LOCAL_LDLIBS := -landroid -lGLESv2 -lEGL -llog
LOCAL_C_INCLUDES += $(LOCAL_PATH)/include
LOCAL_C_INCLUDES += $(CUDA_TOOLKIT_ROOT)/targets/armv7-linux-androideabi/include
include $(BUILD_SHARED_LIBRARY)
Application.mk文件举例
APP_ABI := armeabi-v7a
APP_PLATFORM := android-19
APP_STL := gnustl_static
调用的时候在类中load一下就可以了,举例:
native void cMethod(int h, int w, float factor, int out_h, int out_w, byte[] data, byte[] dehazeData, int mode);
static {
System.loadLibrary("imagesr");
}
a. 查看so是不是编译成ARM模式下的so
$ file libtest.so
libtest.so: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, not stripped
b. 如果别人提供了你一个so,查看提供了哪些方法,更详细的用法,查看nm命令
$ nm libtutorial.so |grep T
00001344 a _GLOBAL_OFFSET_TABLE_
000002a8 T getinformation
000002b4 T getinformation2
生成so文件的makefile文件举例:
主要是指定编译器为NDK的编译器即可,其他的和一般的so文件的编译一样,不懂的可以看下“跟我一起写Makefile-陈皓”
一下是我的makefile,大家千万不要照葫芦画瓢!仅当自己mark一下用
#environment setup
GCC=$(NDK_ROOT)/toolchains/arm-linux-androideabi-4.6/gen_standalone/linux-x86_64/bin/arm-linux-androideabi-g++
NVCC=$(CUDA_TOOLKIT_ROOT)/bin/nvcc -ccbin $(GCC) -target-cpu-arch=ARM -m32 -arch=sm_32 -O3 -Xptxas '-dlcm=ca' -target-os-variant=Android
#INCLUDES+= /helper/files/include
CFLAGS += $(addprefix -I, $(INCLUDES))
ARM_CFLAGS += -O3 -mfpu=neon -mfloat-abi=softfp -mcpu=cortex-a15 -ftree-vectorize -flax-vector-conversions -I/home/ubuntu/NVPACK/android-ndk-r10c/toolchains/arm-linux-androideabi-4.6/gen_standalone/linux-x86_64/lib/gcc/arm-linux-androideabi/4.6/include
OBJS += \
sr_ARM.o sr_CUDA.o
%.o: %.cu
$(NVCC) $(CFLAGS) $(EXTRA_CFLAGS) -c -o "$@" "$<"
%.o: %.cpp
$(GCC) $(CFLAGS) $(ARM_CFLAGS) -c -o "$@" "$<"
libsr_C.a: $(OBJS)
$(NVCC) -lib -o "$@" $(OBJS)
libsr_C.so: $(OBJS)
$(NVCC) -shared -o "$@" $(OBJS)
clean:
rm -rf *.a $(OBJS)
JNI动态库生成、编译、查看相关简易资料的更多相关文章
- windows android studio 编译Jni动态库
项目需要,折腾了半天搞定windows android studio环境编译Jni动态库,现记录下来. 准备安装环境: 1. android studio 下载地址是http://www.androi ...
- Linux动态库的编译与使用 转载
http://hi.baidu.com/linuxlife/blog/item/0d3e302ae2384d3a5343c1b1.html Linux下的动态库以.so为后缀,我也是初次在Linux下 ...
- Linux动态库的编译与使用
转载: http://hi.baidu.com/linuxlife/blog/item/0d3e302ae2384d3a5343c1b1.html Linux下的动态库以.so为后缀,我也是初次在Li ...
- Linux动态库生成与使用指南
相关阅读: Linux静态库生成指南 Linux下动态库文件的文件名形如 libxxx.so,其中so是 Shared Object 的缩写,即可以共享的目标文件. 在链接动态库生成可执行文件时,并不 ...
- Linux下动态库生成和使用
Linux下动态库生成和使用 一.动态库的基本概念 1.动态链接库是程序运行时加载的库,当动态链接库正确安装后,所有的程序都可以使用动态库来运行程序.动态链接库是目标文件的集合,目标文件在动态链接库中 ...
- Windows下动态库的编译以及调用
1.MFC下生成动态库 1>显式调用 在.cpp文件里添加接口函数 int sum(int a,int b) { return a + b; } int sub(int a,int b) { r ...
- Linux上静态库和动态库的编译和使用
linux上静态库和动态库的编译和使用(附外部符号错误浅谈) 这就是静态库和动态库的显著区别,静态库是编译期间由链接器通过include目录找到并链接到到可执行文件中,而动态库则是运行期间动态调用,只 ...
- Linux动态库生成以及调用
Linux下动态库文件的文件名形如 libxxx.so,其中so是 Shared Object 的缩写,即可以共享的目标文件. 在链接动态库生成可执行文件时,并不会把动态库的代码复制到执行文件中,而是 ...
- Windows、Linux、Mac OSX编译jni动态库
在不同平台下默认调用不同名字的动态库,在Windows平台调用name.dll,在Linux平台调用libname.so,在OSX下调用libname.jnilib.不同平台下的编译的方法也有些区别. ...
随机推荐
- ubuntu16.04新服务器上配置selenium+firefox
ubuntu16.041安装pythonsudo apt-get install python默认2.7.122更新apt-getsudo apt-get update更新下apt-get库否则下载p ...
- 带伪3d的类型的流程画图工具
Edraw Max 类似:
- Excel 将换行符替换为空
Step1:按快捷键Ctrl+H,打开"查找和替换"对话框: Step2:选择"查找内容"后的文本框,按住Alt键,在数字键盘中输入&quo ...
- 【SpringMVC学习02】走进SpringMVC的世界
上一篇博文主要介绍了springmvc的整个架构执行流程,对springmvc有了宏观上的把握,这一篇博文主要以案例作为驱动,带你走进springmvc的世界.案例中的需求很简单:对商品列表的查询.表 ...
- Sql Server分页分段查询百万级数据四种项目实例
实际项目中需要实现自定义分页,最关键第一步就是写分页SQL语句,要求语句效率要高. 那么本文的一个查询示例是查询第100000-100050条记录,即每页50条的结果集.查询的表名为infoTab,且 ...
- rational rose 2007安装破解全过程
1:下载安装文件 下载地址: http://pan.baidu.com/s/1c0ldKEs 2:下载虚拟光驱 由于下载的文件须要光驱安装,所以须要下载一个虚拟光驱,虚拟光驱名称:daemon too ...
- Android中图片的三级缓存策略
在开发过程中,经常会碰到进行请求大量的网络图片的样例.假设处理的不好.非常easy造成oom.对于避免oom的方法,无非就是进行图片的压缩.及时的回收不用的图片.这些看似简单可是处理起来事实上涉及的知 ...
- Notes from Data Guard
There are two types of Standby databases: 1, Physical standby database block-for-block basis the phy ...
- Atitit.js this错误指向window的解决方案
Atitit.js this错误指向window的解决方案 1.1. 出现地点and解决之道1 1.2. call,apply和bind这三个方法2 1.2.1. Function.prototype ...
- Atitit.虚拟机与指令系统的设计
Atitit.虚拟机与指令系统的设计 1. 两种计算模型 ,堆栈机和状态机(基于寄存器的虚拟机1 1.1.1. 堆栈机1 1.1.2. 状态机2 2. 为什么状态机比堆栈机快呢?3 2.1. Sta ...