栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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进入到工程路径 NdkDemoappsrcmainjava,执行命令生成.h头文件。
javah -classpath . -jni com.csu.ndkdemo.MyJNI


在MyJNI.java文件的同级目录(mainjavacom.csu.ndkdemo)生成一个.h的头文件com_csu_ndkdemo_MyJNI.h。

#include 


#ifndef _Included_com_csu_ndkdemo_MyJNI
#define _Included_com_csu_ndkdemo_MyJNI
#ifdef __cplusplus
extern "C" {
#endif

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 
#include 
#include 

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进入到工程路径 NdkDemoappsrcmainjava,执行命令编译生成.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);
    }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/629888.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号