Android Studio Jni 开发实例

来源:互联网 发布:手机直播源码破解版 编辑:程序博客网 时间:2024/05/17 00:52

android studio jni 开发步奏如下:

1、在AS中新建一个Project,新建native JniUtils类

public class JniUtils {      public native String getVersion();}

2、生成class文件


3、根据生成的class文件,javah生成对应的 .h头文件。

C:\Users\xin\workspace\jniDemo\app\build\intermediates\classes\debug>javah -jni com.demo.sheng.jnidemo.JniUtils        C:\Users\xin\workspace\jniDemo\app\build\intermediates\classes\debug>ls        android  com  com_demo_sheng_jnidemo_JniUtils.h

注:当java类中有相关的android依赖类时(android.content.Context),会报异常javah 找不到类android.content.Context。

原因是环境变量未设置,要在CLASSPATH下增加

C:\...\sdk\platforms\android-23\android.jar


h文件内容如下:

/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class com_demo_sheng_jnidemo_JniUtils */#ifndef _Included_com_demo_sheng_jnidemo_JniUtils#define _Included_com_demo_sheng_jnidemo_JniUtils#ifdef __cplusplusextern "C" {#endif/* * Class:     com_demo_sheng_jnidemo_JniUtils * Method:    getVersion * Signature: ()Ljava/lang/String; */JNIEXPORT jstring JNICALL Java_com_demo_sheng_jnidemo_JniUtils_getVersion  (JNIEnv *, jobject);#ifdef __cplusplus}#endif#endif
5、在app/main目录下创建jni目录,把h拷贝过来,并编写JniUtils.c文件

#include "com_demo_sheng_jnidemo_JniUtils.h"JNIEXPORT jstring JNICALL Java_com_demo_sheng_jnidemo_JniUtils_getVersion  (JNIEnv * env, jobject obj){    return (*env)->NewStringUTF(env,"  Android Studio NDK JNI developer ! current version 1.0 !");}

6、编写Android.mk文件

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE    := JniUtilsLOCAL_SRC_FILES := JniUtils.cLOCAL_LDLIBS += -llog include $(BUILD_SHARED_LIBRARY)

7、ndk-build 生成so文件

C:\Users\xin\workspace\jniDemo\app\src\main\jni>ndk-build        [arm64-v8a] Compile        : JniUtils <= JniUtils.c        [arm64-v8a] SharedLibrary  : libJniUtils.so        [arm64-v8a] Install        : libJniUtils.so => libs/arm64-v8a/libJniUtils.so        [x86_64] Compile        : JniUtils <= JniUtils.c        [x86_64] SharedLibrary  : libJniUtils.so        [x86_64] Install        : libJniUtils.so => libs/x86_64/libJniUtils.so        [mips64] Compile        : JniUtils <= JniUtils.c        [mips64] SharedLibrary  : libJniUtils.so        [mips64] Install        : libJniUtils.so => libs/mips64/libJniUtils.so        [armeabi-v7a] Compile thumb  : JniUtils <= JniUtils.c        [armeabi-v7a] SharedLibrary  : libJniUtils.so        [armeabi-v7a] Install        : libJniUtils.so => libs/armeabi-v7a/libJniUtils.so        [armeabi] Compile thumb  : JniUtils <= JniUtils.c        [armeabi] SharedLibrary  : libJniUtils.so        [armeabi] Install        : libJniUtils.so => libs/armeabi/libJniUtils.so        [x86] Compile        : JniUtils <= JniUtils.c        [x86] SharedLibrary  : libJniUtils.so        [x86] Install        : libJniUtils.so => libs/x86/libJniUtils.so        [mips] Compile        : JniUtils <= JniUtils.c        [mips] SharedLibrary  : libJniUtils.so        [mips] Install        : libJniUtils.so => libs/mips/libJniUtils.so

8、build.gradle中设置(不设置会报错Your project contains C++ files but it is not using a supported native build system.

sourceSets.main {    jniLibs.srcDirs 'src/main/libs'    jni.srcDirs = [] // This prevents the auto generation of Android.mk}
9、在JniUtils类中加载so文件

static {    System.loadLibrary("JniUtils");   }
10、编译工程运行



0 0