一、Java调C
- 编写Native方法。
- 使用javah命令生成.h头文件。
- 复制.h头文件到CPP工程中。
- 复制jni_md.h和jni.h到CPP工程中。
- 实现.h头文件中生成的。
- 生成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++项目
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")
}
}
}
效果图: