Android Studio JNI开发(二)——Java调用C方法输出字符串

Android Studio JNI开发(二)——Java调用C方法输出字符串

  1. 新建Android项目
    在这里插入图片描述

  2. 在local.properties 文件配置ndk路径

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

在这里插入图片描述

  1. File ----> Project Structure ----> SDK Lcation配置Android NDK location。
    在这里插入图片描述

  2. gradle.properties文件配置兼容老的ndk

android.useDeprecatedNdk=true

在这里插入图片描述
5. 新建Java JNI 类 MyJni.java,并编写JNI native方法。

package com.csu.ndkdemo;

public class MyJNI {
    
    

    public native String sayHello();

}
  1. 生成头文件,cmd进入到工程路径 NdkDemo\app\src\main\java,执行命令生成.h头文件。
javah -classpath . -jni com.csu.ndkdemo.MyJNI

在这里插入图片描述
在MyJNI.java文件的同级目录(main\java\com.csu.ndkdemo)生成一个.h的头文件com_csu_ndkdemo_MyJNI.h

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

#ifndef _Included_com_csu_ndkdemo_MyJNI
#define _Included_com_csu_ndkdemo_MyJNI
#ifdef __cplusplus
extern "C" {
    
    
#endif
/*
 * Class:     com_csu_ndkdemo_MyJNI
 * Method:    sayHello
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_csu_ndkdemo_MyJNI_sayHello
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif
  1. main下java同级目录新建jni目录,将step6生成的.h文件拷贝到jni目录,然后新建Hello.c文件,实现.h文件中的方法。
#include <stdio.h>
#include <stdlib.h>
#include <jni.h>

JNIEXPORT jstring JNICALL Java_com_csu_ndkdemo_MyJNI_sayHello(JNIEnv *env, jobject thiz) {
    
    
    return (*env)->NewStringUTF(env, "I`m Str from jni libs!");
}
  1. jni目录下新建Android.mk文件。
    在这里插入图片描述
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := Hello
LOCAL_SRC_FILES := Hello.c

APP_ABI := all

include $(BUILD_SHARED_LIBRARY)
  1. cmd进入到工程路径 NdkDemo\app\src\main\java,执行命令编译生成.so文件。
ndk-build

在这里插入图片描述
在jni同级目录下会生成两个文件夹libs和obj。
在这里插入图片描述

  1. 将libs文件夹下的内容拷贝到module项目名下的libs目录。
    在这里插入图片描述
  2. module的build.gradle 文件的android{}节点中添加对libs的引用:
sourceSets {
    main {
        jniLibs.srcDirs = ['libs']
    }
}

在这里插入图片描述

  1. JNI Java文件MyJni.java中加载.so文件。
package com.csu.ndkdemo;

public class MyJNI {
    
    

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

    public native String sayHello();

}
  1. Activity中调用JNI方法,并将C中的字符串打印出来。
public class MainActivity extends AppCompatActivity {
    
    

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

		// 调用JNI方法
        String rs = new MyJNI().sayHello();
        Log.i("MainActivity", "onCreate: " + rs);
    }
}

猜你喜欢

转载自blog.csdn.net/tracydragonlxy/article/details/121315112