Android中JNI使用详解(3)---Android Studio中SO文件生成

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lsf1025995457/article/details/51902350

AndroidJNI使用详解(2)---Android StudioSO文件生成


上一篇写到过在Android Studio中配置NDK环境地址:Android Studio中NDK环境配置

这篇文章讲解在Android Studio中如何使用NDK生成so文件


1、首先创建一个Android Studio项目


创建 jni 目录:在项目中右键 new->folder->jni folder 选择 main 文件夹点击 finish ,这时候在项目中 app->main 生成了 jni 目录,当然也可以手动创建。


2、创建native方法


在项目中创建 com.jni.test 包,在包中创建 NativeUtil.class 文件 , 添加 native 方法 ;


package com.jni.test;

/**
 * Created by Shaofeng.lan on 2016/7/12.
 */
public class NativeUtil {
    public static native String getJniString();
}

3、生成.h文件

3.1Terminal(位置在Android Studio下面)输入命令cd app/src/main/java进入app java路径。

D:\AndroidStudio\NdkDemo>cd app/src/main/java

3.2输入命令执行javah +【包名+文件名】如:javah com.jni.test.NativeUtil

D:\AndroidStudio\NdkDemo\app\src\main\java>javah com.jni.test.NativeUtil

3.3然后在java目录下可以看见生成的对应.h【com_jni_test_NativeUtil.h文件。


com_jni_test_NativeUtil.h代码:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_jni_test_NativeUtil */

#ifndef _Included_com_jni_test_NativeUtil
#define _Included_com_jni_test_NativeUtil
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_jni_test_NativeUtil
 * Method:    getJniString
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_jni_test_NativeUtil_getJniString
  (JNIEnv *, jclass);

#ifdef __cplusplus
}
#endif
#endif

4、编写.c文件

将生成的.h文件拷贝到jni文件夹中,并重命名为test.c并实现native方法

test.c代码:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_jni_test_NativeUtil */

#ifndef _Included_com_jni_test_NativeUtil
#define _Included_com_jni_test_NativeUtil
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_jni_test_NativeUtil
 * Method:    getJniString
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_jni_test_NativeUtil_getJniString
  (JNIEnv * env, jclass jobj){
   return (*env)->NewStringUTF(env,"Hello JNI!");
  }

#ifdef __cplusplus
}
#endif
#endif

5、配置jni环境


appbuild.gradle文件中,在defaultConfig节点添加一下代码
ndk {
    moduleName "JniDemo"
    ldLibs "log", "z", "m"
    abiFilters "armeabi", "armeabi-v7a", "x86"
}

整体代码如下:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.3"

    defaultConfig {
        applicationId "com.example.shaofenglan.ndkdemo"
        minSdkVersion 9
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
        ndk {
            moduleName "JniDemo"
            ldLibs "log", "z", "m"
            abiFilters "armeabi", "armeabi-v7a", "x86"
        }
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.4.0'
}

projectgradle.properties目录下添加:

android.useDeprecatedNdk=true

查看projectlocal.properties目录是否有配置ndk环境:

ndk.dir=【NDK路径】


6、生成so文件

执行Build->Rebuild Project就可以编译出SO 文件,如图:

app -> build -> intermediates -> ndk -> debug -> lib 中可以看到生成的 so文件,如图:


7、调用so文件


加载静态库:

static {
    System.loadLibrary("JniDemo");
}

然后调用native方法,代码如下:

package com.example.shaofenglan.ndkdemo;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

import com.jni.test.NativeUtil;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.e("TAG", NativeUtil.getJniString());
    }

    static {
        System.loadLibrary("JniDemo");
    }
}

控制台打印:



猜你喜欢

转载自blog.csdn.net/lsf1025995457/article/details/51902350