Mac系统下JNI实现native方法(Java调用C++语言的实现)
- 在java类里声明需要使用的方法
- 使用JNI命令生成c++的方法声明.h文件
- 根据生成的.h文件制作c++实现文件native2C.cpp
- 创建CMakeLists.txt文件
- 在build.gradle添加扩展bundle声明
- 编译使用
-
1.在java类里声明需要使用的方法
public class TestNativeCode {
public native void sayHello();
public native String tellMe();
}
-
2.使用JNI命令生成c++的方法声明.h文件
注意生成的文件路径必须在java包名外
# com.example.surfaceviewdemo是包名
# TestNativeCode是java文件名,不含.java
javah -jni com.example.surfaceviewdemo.TestNativeCode;
-
3.根据生成的.h文件制作c++实现文件native2C.cpp
#include "jni.h"
#include "stdio.h"
#include <string>
extern "C" JNIEXPORT void JNICALL
Java_com_example_surfaceviewdemo_TestNativeCode_sayHello(JNIEnv *, jobject) {
printf("Hello world from cpp");
}
extern "C" JNIEXPORT jstring JNICALL
Java_com_example_surfaceviewdemo_TestNativeCode_tellMe(JNIEnv * env, jobject ) {
std::string str = "Hello from c++";
return env->NewStringUTF(str.c_str());
}
此时,可以删除第二步生成的.h文件(.h文件主要是为了自动转换方法名)
-
4.创建CMakeLists.txt文件
cmake_minimum_required(VERSION 3.4.1)
add_library(
nativeCode
SHARED
../../../native2C.cpp
)
find_library(
log-lib
log
)
target_link_libraries(
nativeCode
${log-lib}
)
-
5. 在build.gradle添加扩展bundle声明
android {
compileSdkVersion 28
defaultConfig {
applicationId "com.example.surfaceviewdemo"
minSdkVersion 21
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
# 此处为添加的部分
externalNativeBuild {
cmake {
path "src/main/java/com/example/surfaceviewdemo/CMakeLists.txt"
version "3.6.0"
}
}
}
-
6. 编译使用
#加载lib
System.loadLibrary("nativeCode");
TestNativeCode testNativeCode = new TestNativeCode();
testNativeCode.sayHello();
String hello = testNativeCode.tellMe();
System.out.println(hello);
网友评论