zoukankan      html  css  js  c++  java
  • JNI动态库生成、编译、查看相关简易资料 Sanny.Liu

    有一篇好博文,大家可以看下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)

  • 相关阅读:
    CentOS7.6下 MariaDB的MHA 集群搭建(一)
    Mariadb10.4 集群压力测试(一)
    Galera 核心参数详解(一)
    Mariadb10.4+ ERROR 1118 (42000): Row size too large (> 8126). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline.
    手动打造一个弹窗程序
    IAT HOOK
    进制的本质
    基于数组越界的缓冲区溢出
    函数调用堆栈图-c语言
    算法之二分查找(上)-c语言实现
  • 原文地址:https://www.cnblogs.com/hansjorn/p/4712773.html
Copyright © 2011-2022 走看看