Android Studio中实战Jni开发

AS中实战Jni开发

Jni(Java Native Interface )其实是Java平台与C/C++及其他语言交互的接口,基于Android SDK开发的应用用的事java语言,自然可以通过Jni调用C/C++代码满足一些特殊需求。

为了便于提高安卓平台JNI开发模式,Google提供了一套工具集Native Development Kit(NDK)来调用动态库,使得开发者可以快速方便的完成JNI调用。

本文中演示在Android Studio中怎样创建一个JNI Hello工程

1.创建一个普通安卓工程

目录结构如下,为AS默认创建的一个工程

目录结构

2.添加native接口

在将要使用JNI接口的类中添加以下代码。为了调用方便,本例中直接在activity中添加。

  public native String hellojni();

3.生成 .h 文件

命令格式:

#操作命令:
javah -d jni -classpath <SDK_android.jar>;<APP_classes> lab.sodino.jnitest.MainActivity

为了方便可以写个脚本帮我们完成该步骤:

#!/bin/sh
export ProjectPath=$(cd "../$(dirname "$1")"; pwd)
export TargetClassName="lemon.hellojni.MainActivity"

export SourceFile="${ProjectPath}/app/src/main/java"
export TargetPath="${ProjectPath}/app/src/main/jni"

cd "${SourceFile}"
javah -d ${TargetPath} -classpath "${SourceFile}" "${TargetClassName}"
echo -d ${TargetPath} -classpath "${SourceFile}" "${TargetClassName}"

使用该代码时只需修改包名和路径即可。
如果你的AS中装有Bash Plugin,可以直接执行该脚步,会生成目标文件lemon_hellojni_MainActivity.h
项目目录

4.创建.c/.cpp 文件,实现我们的c/c++代码

此处参考了googlesample hello-jni

#include "lemon_hellojni_MainActivity.h"

jstring JNICALL Java_lemon_hellojni_MainActivity_hellojni
        (JNIEnv* env, jobject obj)
{
    return (*env)->NewStringUTF(env, "Hello, Jni world~");
}

C++代码与C借口有一点不同,如下:

#include "lemon_hellojni_MainActivity.h"

jstring JNICALL Java_lemon_hellojni_MainActivity_hellojni
        (JNIEnv* env, jobject obj)
{
    return env->NewStringUTF("Hello, Jni world~");
}

5.配置相关参数,Built Project

如果没有配置ndk环境变量的化需要在local.properties 中添加:

ndk.dir=/Users/lemon/ndk/android-ndk-r10e

gradew 2.5后对配置有所变动,更加系统化,参考google
本例中采用兼容模式,在grade.properties 中添加:

android.useDeprecatedNdk=true

在app module 中的build.gradle 中找到defaultconfig,添加:

defaultConfig {                   
  applicationId "lemon.hellojni"  
  minSdkVersion 9                 
  targetSdkVersion 23             
  versionCode 1                   
  versionName "1.0"               
  ndk {                           
    moduleName "hellojni"         
  }                               
}                                 

编译后生成build目录:
生成so文件目录

6.总结

运行后,可以看到输出了我们在c代码中返回的字符,说明jni调用成功了。
这里写图片描述

以上是一种jni调用方法,在以上过程中,我们编译生产的so文件可以直接放到项目中复用。
在main目录下建立jnlLibs 文件夹,把生产的so文件放入即可。

实例源码Git查看

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值