Android中JNI的使用之HelloWorld

本文详细介绍了如何配置JNI环境,并通过实例演示了如何在Android应用中实现Java与C/C++的交互,包括创建本地方法、编写C代码、构建Android.mk等步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.配置JNI环境

下载ndk版本
配置环境变量–>将ndk-build.cmd文件所在路径配置到path中

2.创建一个android工程

2.1 在MainActivity中创建一个本地方法

package com.example.jni;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity implements OnClickListener{

    private Button btn;

//这个静态代码块“hello”对应的是Android.mk中的  LOCAL_MODULE    := hello  
 static{
        System.loadLibrary("hello");
    }

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

        btn = (Button) findViewById(R.id.btn);

        btn.setOnClickListener(this);

    }

    @Override
    public void onClick(View v) {

        String str = helloFromC();

        Toast.makeText(this, str, Toast.LENGTH_LONG).show();

    }

    //声明一个本地方法,让java调用c方法
    public native String helloFromC();

}

2.2在工程中创建一个文件夹-名字为jni
2.3在jni文件夹中创建一个hello.c文件

如下图所示:
这里写图片描述

3.在hello.c写如下代码

jni.h–表示ndk中的头文件

#include <stdio.h>    
#include <stdlib.h>
#include <jni.h>

/**
 *
 * 实现在MainActivity中 声明的本地方法
 *
 * 方法命名规范:
 *         1.Java_(包名)_(类名)_(方法名)
 *         2.根据jni规范要求,必须传入2个参数JNIEnv* env,jobject obj
 *
 *    在jni-h的文件中找到JNIEnv    JNIEnv 的类型:JNINativeInterface
 *     struct JNINativeInterface* JNIEnv        JNINativeInterface为结构体
 *
 *    eg:二级指针概念
 *    int i  =10;
 *    int* p = &i;
 *    int** q = &p;
 *    那么 取出i的值:**q就取出的值了
 *
 *    eg:
 *    调用这个方法    (*GetVersion)(JNIEnv *);
 *
 *    第一种调用的方法:(**Env).GetVersion(env);
 *
 *    第二种调用的方法:(*Env)->GetVersion(env);
 *
 *
 *    我们需要的是返回jstring的方法,在jni-h文件中找到如下方法
 *
 *    jstring     jstring     (*NewStringUTF)(JNIEnv*, const char*);
 */

 jstring  Java_com_example_jni_MainActivity_helloFromC(JNIEnv* env , jobject obj){

    //     (*NewStringUTF)(JNIEnv*, const char*);

    return (*env)->NewStringUTF(env,"hello java");

}

4 C代码写好之后,我们需要在jni目录创建一个Android.mk的文件

内容为:
        LOCAL_PATH := $(call my-dir)
        include $(CLEAR_VARS)
        LOCAL_MODULE    := hello        //表示库文件,名字与java代码中的静态代码块名字相同
        LOCAL_SRC_FILES := hello.c        //表示c文件,文件名必须相同
        include $(BUILD_SHARED_LIBRARY)

5.编译后会在libs文件夹中生成一个.so的文件(需要刷新工程)

编辑的指令
这里写图片描述

6.在MainActivity文件中需要添加一个静态代码块

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

运行工程,点击button,会弹出tosat.
这里写图片描述

总结开发步骤

[1]定义一个本地方法 需要C去实现
public native String helloFromC();
[2]在Android工程下创建一个jni目录 创建一个folder
[3]在jni目录下创建C文件 实现我们在mainActivity中声明的本地方法
[4]定义实现的方法 Java_(包名)(类名)(方法名) 必须要接收2个参数JNIEnv* env jobject obj
[5]查看jni.h的头文件 找到函数指针 实现方法
[6]只要C代码写好了 就是要ndk-build去编译一下
[7]需要一个Android.mk文件 在ndk的docs下
[8]编译之后 会在libs下生成一个so库文件
[9]最后一步 一定要记得加载动态库文件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值