android studio 使用JNI调用C程序

安装配置NDK

下载

http://developer.android.com/intl/zh-cn/ndk/downloads/index.html#download

下载后运行exe程序会在当前目录下解压缩出来NDK的所有文件,移到本地的目录下。

配置环境变量

打开windows系统,属性,环境变量,定义下面两个部分:

前者为NDK文件放置的目录,后者为:%NDK_ROOT%;注意分号。

验证

cmd里面输入ndk-build,没有提示找不到差不多配置就算完成了。(正确应提示could not find application…)

配置android studio环境

1

在gradle.properties文件中添加 Android.useDeprecatedNdk = true

其中gradle.properties在工程目录下(注意:不是gradle–wrapper目录下的这个文件)。

2

在当前android studio的工程设置面板(工程名字上右键open module Setting或F4),在弹出的界面中选中SDK Location,配置好最下面的NDK location,找到对应的目录,我的已经配置好的。

3

在工程目录下的local.porperties文件中添加为下面样式:

ndk.dir=D:\\Android\\sdk\\ndk-bundle
sdk.dir=D:\\Android\\sdk

我的工程在新建后已经默认生成好了这个内容。

4

在gradle文件中添加以下内容(图片1处),该app的gradle文件中。

注意这里的moduleName,是我们在之前自己编写的类里面加载的so库名

 ndk {
    moduleName "JniTest"
    ldLibs "log", "z", "m"
    abiFilters "armeabi", "armeabi-v7a", "x86"
}

有的文档说也需要添加以下的内容在gradle中(图片2处)

sourceSets{
    main{
        jniLibs.srcDirs = ['libs']
    }
}

声明native方法与编译

这个类是java与C/C++交互的中介,方法由java声明,由C/C++实现。

这儿需要新建一个类,不在Activity类里面写是为了避免编译时报错:找不到android.support.v7.app.AppCompatActivity。

public class myJNI {

  //加载so库
    static {
        System.loadLibrary("JniTest");
    }

  //native方法
    public static native String sayHello();

}

编译

这儿的路径部分很重要。

可以在android studio的终端下的命令行工具里面编译,打开该工具的方法为软件最下方的Terminal。如果没有的话可以点击菜单栏的view–Tool Windows–Terminal。

class文件

打开后当前命令行处于的目录部分不确定,首先将那个native所在的方法编译为class文件。

F:\Temp\Other\JNI\myJni\app\src\main\java\app\tongbang\com\myjni>javac myJNI.java

注意目录部分。

PS:好像可以
执行Build->Cliear Project和Rebuild Project生成class文件

h文件

接着编译h文件,需要更换目录,这里的路径变更使用cd命令(不会cd命令的百度cmd进出文件夹方法),如下所示:

F:\Temp\Other\JNI\myJni\app\src\main\java>javah -jni app.tongbang.com.myjni.myJNI

到达工程的java目录下,注意最后面的app.tongbang.com.myjni为工程的包名,myJNI为类名,编译成功后会在工程的包名下生成文件app_tongbang_com_myjni_myJNI.h

构建C文件

在编译好h文件后,打开该h文件,复制全部内容,在工程目录下的app–src–main下新建文件夹jni,再在里面新建c文件比如main.c,将h文件的内容复制到里面,注意的是,这儿的文件内容是头文件的文件内容,所以必需要把原本的函数声明内容变更为具体的函数内容实现。

此外,在写完c文件后,需要在该目录(jni)下新建一个c文件,名字为util.c,内容为空,网上有的帖子说不加这个文件会报错,但是我没有加成功实现了,可加可不加。

如果前面的步骤正常,那么此时编译应该可以成功了。可以实体化带有调用c程序的类,使用里面的方法。

生成so库与使用

在工程编译成功后,so库也已经成功产生,在项目的app\build\intermediates\ndk\debug\lib路径下

在src\main下新建文件夹jniLIB,并将生成的SO文件拷贝到该文件夹下

流程

编写静态方法(用java声明)–>编译生成class文件—>编译生成h文件—->编写C文件(用C/C++实现)
—->配置NDK—->配置so库—->在Activity调用(Java调用C/C++)。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android Studio调用JNI(Java Native Interface)可以实现Java与C/C++之间的相互调用。下面是一般的步骤: 1. 创建JNI文件夹:在Android Studio的项目目录下,创建一个名为"jni"的文件夹。 2. 创建C/C++源文件:在"jni"文件夹中创建一个C/C++源文件,例如"native-lib.c"。 3. 编写C/C++代码:在源文件中编写C/C++代码,实现所需的功能。 4. 生成头文件:在终端或命令提示符中,进入到"jni"文件夹,并执行以下命令生成头文件: ``` javah -d ../app/src/main/cpp -classpath ../app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes com.example.appname.MainActivity ``` 这里的"com.example.appname.MainActivity"是你的Java类的完整路径。 5. 配置CMakeLists.txt:在项目的根目录下找到"CMakeLists.txt"文件,并添加以下内容: ``` # 设置C/C++源文件路径 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") set(CMAKE_CPP_FLAGS "${CMAKE_CPP_FLAGS} -std=c++11") add_library(native-lib SHARED src/main/cpp/native-lib.c) # 链接JNI库 target_link_libraries(native-lib log) ``` 6. 在Java代码中加载JNI库:在需要使用JNI的Java类中,使用`System.loadLibrary("native-lib")`加载JNI库。 7. 调用JNI方法:在Java代码中,使用`native`关键字声明需要调用JNI方法,并在C/C++代码中实现对应的JNI方法。 8. 构建和运行:点击Android Studio的"Build"菜单,选择"Make Project"来构建项目。然后可以在Java代码中调用JNI方法。 希望以上步骤对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值