接口的作用无非就是取值、传参、方法调用之类的东西。
Android studio默认的native项目就是调用JNI的方法。
在JNI中怎么调用java类的属性,方法;以下为基本示例:
public class MainActivity extends AppCompatActivity {
public int javaNum=3;
// Used to load the 'native-lib' library on application startup.
static {
System.loadLibrary("native-lib");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Example of a call to a native method
TextView tv = findViewById(R.id.sample_text);
tv.setText(stringFromJNI());
Log.d("TAG", "JNI_log onCreate: ...."+javaNum);
}
public void javaMethod(String log){
Log.d("TAG", "javaMethod call:...... "+log);
}
/**
* A native method that is implemented by the 'native-lib' native library,
* which is packaged with this application.
*/
public native String stringFromJNI();
}
cplusplus:
#include <jni.h>
#include <string>
#include<android/log.h>
#define TAG "JNI_log" // 这个是自定义的LOG的标识
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,TAG ,__VA_ARGS__) // 定义LOGD类型
//jni 调用获取/赋值java属性(变量)
int getAndSetField(JNIEnv *env,
jobject thiz/* this */) {
//1.获取
jclass clz = env->GetObjectClass(thiz);
//2.获取属性id
jfieldID myNum = env->GetFieldID(clz, "javaNum", "I");
LOGD("获取属性id jfieldID = %d", myNum);
//3.取值 ps:如果属性域是静态的,那么使用方法GetStaticFieldID, GetStaticObjectField
int value = env->GetIntField(thiz, myNum);
LOGD("获取属性值 value = %d", value);
//4.改值
env->SetIntField(thiz, myNum, 6);
env->DeleteLocalRef(clz);
return 1;
}
//jni 访问java方法
void callJavaMethod(JNIEnv *env,jobject thiz/* this */){
jclass clz = env->GetObjectClass(thiz);
//1.获取方法属性id
jmethodID javaMethod = env->GetMethodID(clz, "javaMethod","(Ljava/lang/String;)V");
//2.调用方法,传递参数
const char *msg = "from native";
jstring jmsg = env->NewStringUTF(msg);
env->CallVoidMethod(thiz,javaMethod,jmsg);
env->DeleteLocalRef(clz);
}
void test(JNIEnv *env,jobject thiz){
getAndSetField(env, thiz);
callJavaMethod(env,thiz);
}
extern "C" JNIEXPORT jstring JNICALL
Java_com_example_myapplication_MainActivity_stringFromJNI(
JNIEnv *env,
jobject thiz /* this */) {
std::string hello = "Hello from C++";
test(env, thiz);
return env->NewStringUTF(hello.c_str());
}
附个比较全的用法示例:JNI 常见用法 - 简书