242.Android Studio 使用 JNI(3)

调用C层代码步骤:

1.第一步JniDataUtil.java中编写java层的native代码

2.在/app/src/app/java目录下执行javah命令生成javah -jni com.ldw.jnitest.JniDataUtil生成.h文件

3.编辑test.cpp代码,实现.h中需要实现的c语言的方法

4.在jni目录下执行ndk-build.cmd命令生成so文件

5.在MainActivity.java中调用JniDataUtil.java中的native方法,简介调用c语言的方法

关键代码如下:

java层申明使用的c++代码 JniDataUtil.java

package com.ldw.hello;

/**
 * author: ldw
 * created on: 2019/10/12 1:05
 * description:
 */
//专门调用jni C++接口的类
public class BridgeUtils {

    private static BridgeUtils instance = null;
    //设置一个单例
    public static BridgeUtils getInstance() {
        if (instance == null) {
            instance = new BridgeUtils();
        }

        return instance;
    }

    //提供一个调用JNI接口的成员方法
    public native void hello_jni();
    public native String hello_jni_string();


    //加载cpp给提供的 动态库
    static {
        System.loadLibrary("FunUtils"); //libtestjni.so
    }
}

com_ldw_jnitest_JniDataUtil.h

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

#ifndef _Included_com_ldw_jnitest_JniDataUtil


#define _Included_com_ldw_jnitest_JniDataUtil
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_ldw_jnitest_JniDataUtil
 * Method:    get
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_ldw_jnitest_JniDataUtil_get
  (JNIEnv *, jclass);
/*
 * Class:     com_ldw_jnitest_JniDataUtil
 * Method:    test_jni
 * Signature: (II)V
 */
JNIEXPORT jint JNICALL Java_com_ldw_jnitest_JniDataUtil_test_1jni
  (JNIEnv *, jobject, jint, jint);
#ifdef __cplusplus
}
#endif
#endif

test.cpp

#include<jni.h>
#include <android/log.h>
//导入我们创建的头文件
#include "com_ldw_jnitest_JniDataUtil.h"

#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_ldw_jnitest_JniDataUtil
 * Method:    get
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_ldw_jnitest_JniDataUtil_get
  (JNIEnv * env, jclass obj)
  {
    return env->NewStringUTF("This is my NDK Application");
  }

JNIEXPORT jint JNICALL Java_com_ldw_jnitest_JniDataUtil_test_1jni
  (JNIEnv * env, jobject obj, jint jni_a, jint jni_b)
  {
        int a = (int) jni_a;
        int b = (int) jni_b;
        __android_log_print(ANDROID_LOG_ERROR,"jni_show", "JNI:a = d%, b = d%", a, b);
        int c = 20;
        return (jint)c;

  }

#ifdef __cplusplus
}
#endif

调用JNI方法的java文件MainActivity.java

package com.ldw.jnitest;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    private Button btn;
    public static String LOG_TAG = "MainActivity===";

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

        initUi();
    }

    public void initUi(){
        btn = (Button) findViewById(R.id.button);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.e(LOG_TAG, JniDataUtil.getInstance().get());
                //输出:2019-10-13 06:37:57.781 3559-3559/com.ldw.jnitest E/MainActivity===: This is my NDK Application
                //Log.e(LOG_TAG, "test_jni===" + JniDataUtil.getInstance().test_jni(12,24) );
                //输出:2019-10-13 06:36:12.426 1059-1059/com.ldw.jnitest E/MainActivity===: test_jni===20
            }
        });
    }
}

输出:

2019-10-13 06:46:20.367 13278-13278/com.ldw.jnitest E/MainActivity===: This is my NDK Application
2019-10-13 06:46:20.367 13278-13278/com.ldw.jnitest E/MainActivity===: test_jni===20

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值