android studio JNI调用c++程序总结

目录

本机环境

 【一】AS工程生成.so文件

1、假如要生成的.so文件名称为libzyLib.so;

2、新建一个zylib.cpp文件,会出现一些提示信息,告诉你工程里面没引用,在CMakeLists.txt文件中配置后即可消除。

3、因为目的是生成libzyLib.so文件,将native-lib相关的内容删掉,然后修改CMakeLists.txt文件。

 4、新建一个java类,名称为zyLib

5、编译工程,Build--> MakeProject;会在\app\build\intermediates\cmake\debug下面看到相应的libzyLib.so文件。

【二】AS调用生成.so文件

1、新建一个新的工程命名为Call_zyLib

2、将上面生成的so文件复制到libs目录下结果如下图

扫描二维码关注公众号,回复: 8653621 查看本文章

3、在build.gradle文件中的android{}中添加下面代码; jniLibs.srcDirs=["xxx"],xxx对应上面复制存放的so文件库路径

4、新建java package名称要和之前packag相同com.example.dell.zylib

5、在MainActivity.java里面调用对应的函数

【参考】



本机环境

win10 64位系统

 【一】AS工程生成.so文件

1、假如要生成的.so文件名称为libzyLib.so;

      新建工程 勾选 include C++ support 选项,一路next,创建默认工程

目录结构如下图 

2、新建一个zylib.cpp文件,会出现一些提示信息,告诉你工程里面没引用,在CMakeLists.txt文件中配置后即可消除。

该cpp文用作调用c++ 代码的实现。先暂时放下。

3、因为目的是生成libzyLib.so文件,将native-lib相关的内容删掉,然后修改CMakeLists.txt文件。

下面将工程默认生成的native-lib.cpp删除,选中delete的时候,选择ok。会提示其他地方有使用到该文件里的内容。

“View Usages”看看哪些地方使用到,说明是CMakeLists.txt里面由使用到该文件的地方。

 MainActivity.java文件中和native-lib相关的注释or删掉。

将之前的native-lib改掉,替换为zyLib ,引用的路径改为上面新建的cpp文件“src/main/cpp/zyLib.cpp”

修改后的CmakeLists.txt文件:

# For more information about using CMake with Android Studio, read the
# documentation: https://d.android.com/studio/projects/add-native-code.html

# Sets the minimum version of CMake required to build the native library.

cmake_minimum_required(VERSION 3.4.1)

# Creates and names a library, sets it as either STATIC
# or SHARED, and provides the relative paths to its source code.
# You can define multiple libraries, and CMake builds them for you.
# Gradle automatically packages shared libraries with your APK.

add_library( # Sets the name of the library.
        zyLib

        # Sets the library as a shared library.
        SHARED

        # Provides a relative path to your source file(s).
        src/main/cpp/zyLib.cpp)

# Searches for a specified prebuilt library and stores the path as a
# variable. Because CMake includes system libraries in the search path by
# default, you only need to specify the name of the public NDK library
# you want to add. CMake verifies that the library exists before
# completing its build.

find_library( # Sets the name of the path variable.
        log-lib

        # Specifies the name of the NDK library that
        # you want CMake to locate.
        log)

# Specifies libraries CMake should link to your target library. You
# can link multiple libraries, such as libraries you define in this
# build script, prebuilt third-party libraries, or system libraries.

target_link_libraries( # Specifies the target library.
        zyLib

        # Links the target library to the log library
        # included in the NDK.
        ${log-lib})

 4、新建一个java类,名称为zyLib

package com.example.dell.zylib;

public class zyLib {
    static {
        System.loadLibrary("zyLib");
    }

    public  static native int Add(int x, int y);
}

新建jni文件夹,成功后在main下面会有一个jni文件夹内容

File-->Settings 进行配置外部工具javah

在zyLib.java文件右键选择刚才配置的javah工具,使用后会在jni文件夹中生成zyLib.java对应的com_example_dell_zylib_zyLib.h头文件

现在回到上面2建立的zyLib.cpp文件中进行相关的代码编写

#include "../jni/com_example_dell_zylib_zyLib.h"

JNIEXPORT jint JNICALL Java_com_example_dell_zylib_zyLib_Add
        (JNIEnv *env, jclass jobj, jint x, jint y) {
    return (x+y);
}

5、编译工程,Build--> MakeProject;会在\app\build\intermediates\cmake\debug下面看到相应的libzyLib.so文件。

右键选中拖到下面terminal中,会自动打开到.so文件所在目录里面,输入nm libzyLib.so|find "Java"查看里面的so文件里面的函数

至此我们的libzyLib.so文件生成结束。

系统默认libXXXX.so,XXXX为自己so文件名

【二】AS调用生成.so文件

使用在【一】中生成的libzyLib.so文件

1、新建一个新的工程命名为Call_zyLib

2、将上面生成的so文件复制到libs目录下结果如下图

3、在build.gradle文件中的android{}中添加下面代码; jniLibs.srcDirs=["xxx"],xxx对应上面复制存放的so文件库路径

 sourceSets {
        main {
            // 设置引用的so库路径
            jniLibs.srcDirs = ["libs"]
        }
    }

4、新建java package名称要和之前packag相同com.example.dell.zylib

然后建立一个java类,此处java类名也要和生成时的类名相同,zyLib

5、在MainActivity.java里面调用对应的函数


查看生成的.so文件相关库依赖

使用ndk-bundle中的readelf.exe工具:

readelf -d libTestLib_2rd.so|find "NEEDED"

查看.so文件导出函数

  • 方法一

nm -D  **.so

但这样能看到所有的导出,乱七八糟的很多,筛选用:

 nm **.so | find XX

  • 方法二

objdump -tT **.so|


【参考】

https://www.jianshu.com/p/e689d0196a17

https://www.jianshu.com/p/09ff3300f453

http://www.cnblogs.com/daniel-shen/archive/2006/10/16/530587.html

https://blog.csdn.net/iuiang6/article/details/7919222

https://www.cnblogs.com/mmmmar/p/6055700.html

Android NDK开发扫盲及最新CMake的编译使用 :https://www.jianshu.com/p/6332418b12b1

https://blog.csdn.net/u014133119/article/details/82347558

发布了33 篇原创文章 · 获赞 3 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/LWLGZY/article/details/84142712
今日推荐