JNI调用C语言

一、Java调C

  1. 编写Native方法。
  2. 使用javah命令生成.h头文件。
  3. 复制.h头文件到CPP工程中。
  4. 复制jni_md.h和jni.h到CPP工程中。
  5. 实现.h头文件中生成的。
  6. 生成dll文件。

C的函数名称:Java_包名_方法名称。

1、java:Test

public class Test {
    public static void main(String[] args) {
        System.out.println(Test.class.getName());
    }

    public static native  void getStringFormC();
}

2、javah:Test.h

javah Test

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

#ifndef _Included_Test
#define _Included_Test
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     Test
 * Method:    getStringFormC
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_Test_getStringFormC
  (JNIEnv *, jclass);

#ifdef __cplusplus
}
#endif
#endif

3、c实现:Test.cpp

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

#ifndef _Included_Test
#define _Included_Test
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     Test
 * Method:    getStringFormC
 * Signature: ()V
 */
JNIEXPORT jstring JNICALL Java_Test_getStringFormC(JNIEnv* env, jclass) {
  //将C的字符串转为JAVA的字符串
  return env -> NewStringUTF("C string");
}

#ifdef __cplusplus
}
#endif
#endif

二、Android JNI

1、Android Studio创建C++项目

JNI调用C语言

2、app/src/main/cpp/CMakeLists.txt: 

# 版本号
cmake_minimum_required(VERSION 3.10.2)

# 项目名称,没有实际意义,可以选填
project("testc1")

# 添加写的cpp项目注意需要在追加在最后面,有先后顺序的
add_library(
		# 参数1:依赖库的名称,仅此一个,在System.loadLibrary("testc1")使用
        testc1

        # 参数2:
        SHARED

        # 参数3:生成的或者自己写的cpp需要加在后面,不能插入到前两个参数中
        native-lib.cpp)


find_library( 
        log-lib

        log)

target_link_libraries( 
        testc1
)

3、app/src/main/cpp/native-lib.cpp

#include <jni.h>
#include <string>

extern "C" JNIEXPORT jstring JNICALL
Java_com_simple_testc1_MainActivity_stringFromJNI(JNIEnv* env,jobject /* this */) {
	// 将C的字符串转为JAVA的字符串
    char* hello = "Hello from C++666";
    return env->NewStringUTF(hello);
}

4、app/src/main/java/com/simple/testc1/MainActivity.kt

class MainActivity : AppCompatActivity() {

    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        // Example of a call to a native method
        binding.sampleText.text = stringFromJNI()
    }

    /**
     * A native method that is implemented by the 'testc1' native library,
     * which is packaged with this application.
     */
    private external fun stringFromJNI(): String

    companion object {
        // Used to load the 'testc1' library on application startup.
        init {
            System.loadLibrary("testc1")
        }
    }
}

效果图:

JNI调用C语言

 

上一篇:DataNode工作机制


下一篇:Blade 模板引擎