调用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