精华内容
下载资源
问答
  • 编写so库,并在其他工程里使用。

    千次阅读 2016-01-03 17:55:18
    so库是linux下的动态链接库,相当于windows下的dll。 后缀一般是".so" 记录下整个流程。 linux下编译代码都需要一个make文件来向编译器解释说明一些内容。 所以需要些两个文件,一个是Android.mk(make文件),一个是...

    so库是linux下的动态链接库,相当于windows下的dll。

    后缀一般是".so"

    记录下整个流程。

    linux下编译代码都需要一个make文件来向编译器解释说明一些内容。

    所以需要些两个文件,一个是Android.mk(make文件),一个是c/c++源码文件。

    源码文件的方法定义名称是受ndk约束的,名称是固定格式的。很长很难记,所以用到一个头文件(就是方法名)生成工具javah命令。这个命令参考上一篇文章。


    1、新建android项目

    2、在项目中新建jni文件

    3、在android项目中,新建一个包,里面写一个类,这个类是你要封装调用so文件里的方法。最好单独拿出来当一个包。因为javah生成的头文件是和这个包名、类名有关系的。

    4、在这个类里可以声明几个native方法。名字随便起,这只是一个和底层交互的接口名。

    public class MainActivity extends Activity {
    
    
    static{
    System.loadLibrary("getVersion");
    }
    public native String getVersion();
    
    }

    5、使用javah生成头文件(见上一篇文章)

    #include <jni.h>
    
    #ifndef _Included_com_example_testso_MainActivity
    #define _Included_com_example_testso_MainActivity
    #ifdef __cplusplus
    extern "C" {
    #endif
    
    JNIEXPORT jstring JNICALL Java_com_example_testso_MainActivity_getVersion
      (JNIEnv *, jobject);
    
    #ifdef __cplusplus
    }
    #endif
    #endif

    6、下面这个就是接口名

    JNIEXPORT jstring JNICALL Java_com_example_testso_MainActivity_getVersion
      (JNIEnv *, jobject)

    7、以上是为了生成so做的准备工作,实际如果你知道命名规范,熟悉整个流程,完全不用这样一步一步生成。直接编写C/C++文件,和Android.mk文件就可以。

    Android.mk

    LOCAL_PATH := $(call my-dir)
    
    include $(CLEAR_VARS)
    
    LOCAL_MODULE    := hello
    LOCAL_SRC_FILES := getVersion.c
    
    include $(BUILD_SHARED_LIBRARY)

    8、然后就可以根据Android.mk里你自己定义的一个源码文件名getVersion.c,新建一个getVersion.c文件,在里面写C/C++代码。

    我这里就是返回一个字符串。语法啥的自己去看吧。这里主要是流程。

    #include "C:\workspace\TestSo\jni\com_example_testso_MainActivity.h"
    JNIEXPORT jstring JNICALL Java_com_example_testso_MainActivity_getVersion(
    		JNIEnv *env, jobject jobject) {
    	return (*env)->NewStringUTF(env, "hello world");
    }
    
    

    9、最后一步就是编译,也参考上一篇文章,使用ndk-build工具编译,然后就会在当前目录下出现一个obj文件夹,一层一层点进去就可以找到一个libhello.so,这个是在Android.mk文件里定义好的名字。。注意这个so文件所在的文件夹名字,我的是armeabi,有的是armeabi-v7a,有的是x86,这都是不同平台的cpu架构。


    10、很关键的一步,如何在其他项目里使用这个so文件。

    再新建一个项目,在这个项目的libs文件夹下,新建armeabi,如果不熟悉,可以多建几个不同的平台,比如armeabi-v7a,x86啊等等,系统会根据自己的平台去特定的文件夹里找so库。把libhello.so放到这个armeabi目录下。


    11、你需要仔细看一下那个头文件的命名,后半部分是Java_com_example_testso_MainActivity_getVersion,包含了包名和类名,这个时候如果你想用这个so库,你引入这个库的方法,和方法所在包的名字必须和这个一样。以此为例,就是你写

    static{
    		System.loadLibrary("getVersion");
    	}
    	public native String getVersion();

    这段话的所在类名字必须是MainActivity,MainActivity所在的包名必须是com.example.testso,必须一样,否则会报错:native method not found异常。尽管你可能其他步骤都正确。

    然后就可以使用这个getVersion()方法了。

    展开全文
  • 一:生成.so ,这里不做说明。百度很多,或者可以查看我的 另一篇文章Mac 下 Android Studio 3.3 简单生成so文件https://mp.csdn.net/postedit/89642794 二.将 .so 文件放入另一个工程。 1、新建android项目 ...

    写本编内容,主要是新手踩了很多坑,一直崩溃找不到对应的库,表示很蛋疼。下面就做一个简单的使用。

    一:生成.so 库,这里不做说明。百度很多,或者可以查看我的 另一篇文章Mac 下 Android Studio 3.3 简单生成so文件 https://mp.csdn.net/postedit/89642794

     

    二.将 .so 文件放入另一个工程。

    1、新建android项目

    2. 把so文件放在 jniLibs

    3.在App Module 的Android节点下

    sourceSets {
        main {
            jni.srcDirs = []
            jniLibs.srcDirs = ['src/main/jniLibs']//说了这么多就只有这一行是最实在的,就是大家所需要的,中括号填的是so文件所在的路径
        }
    }

    4.在新项目路建立和创建so文件时一样的路径

    5.适应so库文件的方法

      以上,谢谢!

     

    展开全文
  • 要点:怎么在Android Studio中调用qt编写so库, 同时怎么去加载相关的qt动态库。 一.QT for Android编译so库 创建Qt Widgets Application ->构建套件选Android, 删除原来的Widget和main;(原文要求创建库工程,...

    本文翻译:QT, THE BETTER ANDROID NDK点击打开链接


    要点:怎么在Android Studio中调用qt编写的so库, 同时怎么去加载相关的qt动态库。


    一.QT for Android编译so库

    创建Qt Widgets Application ->构建套件选Android, 删除原来的Widget和main;(原文要求创建库工程,但是我最后测试和作者后面的的操作有冲突,需要创建app应用)

    pro文件:

    QT       += core gui
    QT += widgets
    
    TARGET = untitled3
    TEMPLATE = app
    
    DEFINES += UNTITLED3_LIBRARY
    
    SOURCES += untitled3.cpp
    
    HEADERS += untitled3.h\
            untitled3_global.h
    
    
    unix {
        target.path = /usr/lib
        INSTALLS += target
    }


    untitled3_global.h:

    #ifndef UNTITLED3_GLOBAL_H
    #define UNTITLED3_GLOBAL_H
    #include <QtCore/qglobal.h>
    #if defined(UNTITLED3_LIBRARY)
    #  define UNTITLED3SHARED_EXPORT Q_DECL_EXPORT
    #else
    #  define UNTITLED3SHARED_EXPORT Q_DECL_IMPORT
    #endif
    #endif // UNTITLED3_GLOBAL_H

    untiled3.h:

    #ifndef UNTITLED3_H
    #define UNTITLED3_H
    
    #include "untitled3_global.h"
    #include <jni.h>
    
    
    class UNTITLED3SHARED_EXPORT Untitled3
    {
    
    public:
        Untitled3();
    
    };
    
    
    #ifdef __cplusplus
    extern "C"
    {
    #endif
    
    JNIEXPORT void JNICALL Java_eu_microscopictopic_scratchclib_JavaNatives_sendIntToClib(JNIEnv * env, jobject thisObj, jint n);
    
    #ifdef __cplusplus
    }
    #endif
    
    
    #endif // UNTITLED3_H

    untiled3.cpp:

    #include "untitled3.h"
    #include "jni.h"
    #include "android/log.h"
    
    Untitled3::Untitled3()
    {
    }
    
    
    JNIEXPORT void JNICALL
    Java_eu_microscopictopic_scratchclib_JavaNatives_sendIntToClib(JNIEnv * env, jobject thisObj, jint n)
    {
        __android_log_print(ANDROID_LOG_INFO, "Scratch_c_lib", "Are you kidding me? receiveToClib:%d", n);
    }
    


    构建目录放在Android studio中,这个在第二步说


    二.构建Android Studio工程

    按照Android Studio正常模式创建(为了和qt工程中jni接口保持一致,包名为:eu.microscopictopic.scratchclib),在app/src/目录下创建qtgen目录,第一步的qt工程构建目录设置为此目录。



    App/build.gradle 

    Android中加入:

    sourceSets {
        main {
            java.srcDirs = ['/src/main/java']
            res.srcDirs = ['src/main/res','src/qtgen/android-build/res']
            jniLibs.srcDirs = ['src/qtgen/android-build/libs'] 
        }
    }
    设置qt库目录和布局目录
    dependencies中加入:
     compile files('src/qtgen/android-build/libs/QtAndroid-bundled.jar')
    加入qt-builded jar编译
    qt工程编译后,在qtgen/android-build/res/valuse/libs.xml文件中可知:
    <?xml version='1.0' encoding='utf-8'?>
    <resources>
        <array name="qt_sources">
            <item>https://download.qt.io/ministro/android/qt5/qt-5.7</item>
        </array>
    
        <!-- The following is handled automatically by the deployment tool. It should
             not be edited manually. -->
    
        <array name="bundled_libs">
            
        </array>
    
         <array name="qt_libs">
             <item>gnustl_shared</item>
    <item>Qt5Core</item>
    <item>Qt5Gui</item>
    <item>Qt5Widgets</item>
    
         </array>
    
        <array name="bundled_in_lib">
            <item>libplugins_platforms_android_libqtforandroid.so:plugins/platforms/android/libqtforandroid.so</item>
    <item>libplugins_platforms_libqminimal.so:plugins/platforms/libqminimal.so</item>
    <item>libplugins_platforms_libqoffscreen.so:plugins/platforms/libqoffscreen.so</item>
    <item>libplugins_generic_libqevdevkeyboardplugin.so:plugins/generic/libqevdevkeyboardplugin.so</item>
    <item>libplugins_generic_libqevdevmouseplugin.so:plugins/generic/libqevdevmouseplugin.so</item>
    <item>libplugins_generic_libqevdevtabletplugin.so:plugins/generic/libqevdevtabletplugin.so</item>
    <item>libplugins_generic_libqevdevtouchplugin.so:plugins/generic/libqevdevtouchplugin.so</item>
    <item>libplugins_imageformats_libqdds.so:plugins/imageformats/libqdds.so</item>
    <item>libplugins_imageformats_libqgif.so:plugins/imageformats/libqgif.so</item>
    <item>libplugins_imageformats_libqicns.so:plugins/imageformats/libqicns.so</item>
    <item>libplugins_imageformats_libqico.so:plugins/imageformats/libqico.so</item>
    <item>libplugins_imageformats_libqjpeg.so:plugins/imageformats/libqjpeg.so</item>
    <item>libplugins_imageformats_libqtga.so:plugins/imageformats/libqtga.so</item>
    <item>libplugins_imageformats_libqtiff.so:plugins/imageformats/libqtiff.so</item>
    <item>libplugins_imageformats_libqwbmp.so:plugins/imageformats/libqwbmp.so</item>
    <item>libplugins_imageformats_libqwebp.so:plugins/imageformats/libqwebp.so</item>
    
        </array>
        <array name="bundled_in_assets">
            
        </array>
    
    </resources>

    此处,qt生成的xml文件已经定义好了 要加载的库文件:
    平台库:libqtforandroid.so
    图片,Gui,Core,Widget等,在qtgen/android-build/libs目录下可以找到
    要加载的库我们知道了,现在在java中怎么去加载这些库文件:
    package eu.microscopictopic.scratchclib;
    
    import 	android.content.Context;
    import 	android.util.Log;
    
    public class JavaNatives {
    
        public static native void sendIntToClib(int n);
    
        public static void init(Context context) {
            load(context, R.array.bundled_in_assets);
            load(context, R.array.qt_libs);
            System.loadLibrary("untitled3");
            //这一步虽然保报错了,但是senderIntToClib方法还是调用成功。
            // W/linker: libuntitled3.so: unused DT entry: type 0x6ffffffe arg 0x3cc
           // W/linker: libuntitled3.so: unused DT entry: type 0x6fffffff arg 0x1
        }
    
        static void load(Context context, int arrayResourceId) {
            String[] libsToLoad = context.getResources().getStringArray(arrayResourceId);
            for (String lib : libsToLoad) {
                if (lib.indexOf('/')>-1) {
                    lib=lib.substring(lib.indexOf('/'));
                }
                if (lib.indexOf("lib")==0) {
                    lib=lib.substring(3);
                }
                if (lib.endsWith(".so")) {
                    lib=lib.substring(0, lib.length()-3);
                }
                Log.i(JavaNatives.class.getSimpleName(), "loading "+lib);
                try {
                    System.loadLibrary(lib);
                } catch (Throwable e) {
                    Log.i(JavaNatives.class.getSimpleName(), "failed to load "+lib+" "+e);
                    e.printStackTrace();
                }
                Log.i(JavaNatives.class.getSimpleName(), "Successfully loaded "+lib);
            }
        }
    }

    在Activity中怎么使用?这里依赖QtAndroid-bundled.jar,我们右键-Add as library-app...:
    java目录:
    使用:
    package com.kdab.training;
    
    import android.os.Bundle;
    import org.qtproject.qt5.android.bindings.QtActivity;
    import eu.microscopictopic.scratchclib.JavaNatives;
    
    public class MyActivity extends QtActivity {
        public static MyActivity s_activity = null;
    
        @Override
        public void  onCreate(Bundle savedInstanceState)
        {
            //JavaNatives.init(getApplicationContext());
            JavaNatives.sendIntToClib(222);
    
            s_activity = this;
            super.onCreate(savedInstanceState);
    
        }
    
        @Override
        protected void onDestroy()
        {
            super.onDestroy();
            s_activity = null;
        }
    }

    这样就可以编写qt android动态库给Android Studio调用了,但是经过我测试,窗体类是无法使用的,具体用途没有实验。







    展开全文
  • 利用php调用so库文件中的代码和编写so简单实例 某个功能被编译到so文件中,那么如何通过php来调用它?一个方法是写一个php扩展模块(php extension),在php中调用该模块内的函数,再通过该模块来调用so中...

    利用php调用so库文件中的代码和编写so简单实例

    某个功能被编译到so文件中,那么如何通过php来调用它?一个方法是写一个php扩展模块(php extension),在php中调用该模块内的函数,再通过该模块来调用so中的函数。下面做一个简单的例子,使用的操作系统是RHEL5。

    首先做一个简单的so文件:

    /**
     * hello.c
     * To compile, use following commands:
     *   gcc -O -c -fPIC -o hello.o hello.c
     *   gcc -shared -o libhello.so hello.o
     */

    int hello_add(int a, int b)
    {
        return a + b;
    }然后将它编译成.so文件并放到系统中:

    $ gcc -O -c -fPIC -o hello.o hello.c
    $ gcc -shared -o libhello.so hello.o
    $ su
    # echo /usr/local/lib > /etc/ld.so.conf.d/local.conf
    # cp libhello.so /usr/local/lib
    # /sbin/ldconfig写段小程序来验证其正确性:

    /**
     * hellotest.c
     * To compile, use following commands:
     *   gcc -o hellotest -lhello hellotest.c
     */
    #i nclude <stdio.h>
    int main()
    {
        int a = 3, b = 4;
        printf("%d + %d = %d/n", a, b, hello_add(a,b));
        return 0;
    }编译并执行:

    $ gcc -o hellotest -lhello hellotest.c
    $ ./hellotest
    3 + 4 = 7OK,下面我们来制作PHP模块。首先确保你安装了 php-devel 包,没有的话请自行从安装光盘上找。然后下载php源代码。我使用的是php-5.2.3.tar.gz,解压缩。

    $ tar xzvf php-5.2.3.tar.gz
    $ cd php-5.2.3/ext然后通过下面的命令建立一个名为 hello 的模块。

    $ ./ext_skel --extname=hello执行该命令之后它会提示你应当用什么命令来编译模块,可惜那是将模块集成到php内部的编译方法。如果要编译成可动态加载的 php_hello.so,方法要更为简单。

    $ cd hello首先编辑 config.m4 文件,去掉第16行和第18行的注释(注释符号为 dnl 。)

    16:  PHP_ARG_ENABLE(hello, whether to enable hello support,
    17:  dnl Make sure that the comment is aligned:
    18:  [  --enable-hello           Enable hello support])然后执行 phpize 程序,生成configure脚本:

    $ phpize然后打开 php_hello.h,在 PHP_FUNCTION(confirm_hello_compiled); 之下加入函数声明:

    PHP_FUNCTION(confirm_hello_compiled);   /* For testing, remove later. */
    PHP_FUNCTION(hello_add);打开 hello.c,在 PHP_FE(confirm_hello_compiled, NULL) 下方加入以下内容。

    zend_function_entry hello_functions[] = {
        PHP_FE(confirm_hello_compiled,  NULL)       /* For testing, remove later. */
        PHP_FE(hello_add,   NULL)       /* For testing, remove later. */
        {NULL, NULL, NULL}  /* Must be the last line in hello_functions[] */
    };然后在 hello.c 的最末尾书写hello_add函数的内容:

    PHP_FUNCTION(hello_add)
    {
        long int a, b;
        long int result;

        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ll", &a, &b) == FAILURE) {
            return;
        }

        result = hello_add(a, b);

        RETURN_LONG(result);
    }保存退出,编译并安装:

    $ ./configure
    $ make LDFLAGS=-lhello
    $ su
    # cp modules/hello.so /usr/lib/php/modules然后在 /var/www/html 下建立一个 hello.php 文件,内容如下:

    <?php
        dl("hello.so");
        echo hello_add(3, 4);
    ?>然后在浏览器中打开hello.php文件,如果显示7,则说明函数调用成功了。

     

    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zuiaituantuan/archive/2010/10/03/5919572.aspx

    展开全文
  • Android NDK ,Cygwin,CDT, Sequoyyah,JNI 安装正确 这两天一直在弄Android的Jni调用第三方,网上有很多教程是基于linux系统,而我使用的是Windows系统,虽然说原理上是相同的,但是对于一个新...
  • SO库版本号管理

    千次阅读 2017-02-10 16:02:40
    编写SO库文件时可以输入版本号 调用SO库文件中特定的函数可以输出版本号
  • linux下so编写 - 动态-类

    千次阅读 2019-02-13 18:01:13
    linux下so编写 - 动态-类 文章目录linux下so编写 - 动态-类引言代码 引言 加载类有点困难,因为我们需要类的一个实例,而不仅仅是一个函数指针。我们无法通过new来创建类的实例,因为类是在动态中定义的而...
  • 自己用NDK编写C++方法生成全平台so库

    千次阅读 2019-12-31 20:12:34
    这里记录一下自己编写的简单C++方法,然后再编写JNI方法,最后通过CMake编译成全平台so库使用。 整个项目结构: 为了方便,我们可以用Android Studio的创建Native C++这个来创建项目,这样会自动给我们生成一个...
  • 使用VS2015中的linux插件进行编写so库的时候,和编写dll一样,需要制定so库对外的接口的.h文件,的路径,指定Linker中的依赖库的在linux上的路径,和Library dependencies,这里依赖库的名字要将前边的“lib“去掉,...
  • 简单实例说明如何使用Android Studio NDK编译so库
  • 关于如何搭建Android NDK开发...如果自己编写好了.so库,那么如何连同jar包引入Android Studio,就是本次所要讨论的问题 百度了好多办法都没啥用,最后从老项目中找到的解决办法 首先在main文件夹下新建一个文件夹j
  • C++编写动态.so或者.dll的陷阱

    千次阅读 2016-11-27 12:02:46
    对于很多的实现者可能会有这样的认识“接口不变就可以不需要重新编译”,其实这句话是有前提的,前提是实现的动态有足够的兼容性和鲁棒性。尤其是C++实现的动态,C++只对语言层规则做了规定,没有二进制级别的...
  • 使用android studio编写so

    千次阅读 2021-02-28 22:16:36
    原文使用的工具已经过时,现在有更简单方便的方法编写.so文件 原文链接:教我兄弟学Android逆向06 用AndroidStudio编写第一个so 本文所使用的android studio版本为v4.1.1 前期准备 使用ndk编译安卓使用的.so文件需要...
  • 关于动态库so的makefile编写

    千次阅读 2020-12-27 15:36:45
    测试的相关代码目录结构 代码源文件 两个目录下的Makefile文件如下 操作步骤 执行make ...此情况表示链接器找不到我们需要的那个so文件,那么需要执行命令 export LD_LIBRARY_PATH=./lib:$LD_LIBRARY
  • 小弟最近在编写跨平台的动态链接,win和linux已经搞定,只差android端。我按照网上的教程搭好Android的环境:QT5.9.1+SDK+NDK-r15c。但是编译的时候提示#include<string>:no such file or dictionay。 Android.mk...
  • php调用c语言编写so动态

    万次阅读 2014-01-06 20:41:37
    PHP除了使用扩展的方式调用c函数,还可以通过socket通信的方式。这里介绍前者。  第一步: 环境搭建 1. 先看本机是否已经安装了较低版本的php  #find /usr -name "php"  或者rpm -aq | grep php  
  • makefile编写、GDB调试、so库文件生成

    千次阅读 2014-09-22 21:31:54
    .SUFFIXES:.c .o //.c和.o建立关联 CC=gcc SRCS=hello.c\  add.c //同时编译两个.c文件 OBJS=$(SRCS:.c=.o)//ORJS=hello.o add.o EXEC=hello ...start: $(OBJS) //依赖hello.o add.o  $(CC) -
  • 本文只是对以前项目的记录,供以后开发参考. 调用三方so库: ...3:编写so工具类,注意上方so名,包名,类名,方法名必须一样 4:使用方法,如 String code = Test.Open("adfdsf", 200, 2); so库文件生成ja...
  • 1,生成SO库需要写两个MK文件 Android.mk 这个是在根目录下面的jni目录下面,如果没有可以创建一个jni文件夹,主要作用是用来存放编写的c c++文件 Android.mk的内容为: LOCAL_PATH:= $(call my-dir) include $...
  • linux c++动态链接库so编写

    万次阅读 2011-04-11 17:07:00
    Linux下的动态链接是.so文件,即:Shared Object,下面是一个简单的例子说明如何写.so以及程序如何动态载入.so中的函数和对象。 testso.h:#ifndef _TESTSO_H #define _TESTSO_H extern "C" { int ...
  • vscode 编译so库,并且引用so库调试

    千次阅读 2019-08-29 13:30:04
    本周就IDE选择、cpp程序编译、so库引用、jni编译方面走了一遍,从C++程序编写、编译调试,引用so库走了一遍,基本还好,没碰到什么难点! 1. IDE选择VsCode,只要下载几个插件就可以进行开发了: 2.在Vscode 中...
  • Android Jni之编写so文件

    2019-02-18 16:59:45
    开发中我们在集成第三方的时候经常用到一些so文件等,但这个so文件是如何编写的?并且我们为什么要用so文件?接下来我们就慢慢谈论一下这两个问题。  我们为什么要用so文件? 一些基础的概念就不说了:首先我们...
  • Android调用so库, so库是c语言编写, 在linux 64位系统+ndk(32位)生成 lib*.so (32位) 环境: 操作系统:Redhat Server 63 编译软件:Code::blocks 开发库:android-ndk-r9c-linux-x86.tar.bz2 2) Android客户端...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 91,953
精华内容 36,781
关键字:

编写so库