so层调用Java层无返回值普通方法和静态方法
一、编写java代码
1.java代码定方法,一个静态一个非静态
public class MainActivity extends AppCompatActivity {
private static Context context;
//普通字段
public String testStr = "java普通字段";
//静态字段
public static String staticTtestStr = "java静态字段";
static{
System.loadLibrary("testJni");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
context = this.getApplicationContext(); //这里是重点,要确保context不为Null
//调用下方的native函数
soCallJavaFunction();
}
//定义两个普通的方法,第一个普通的方法
public void _method(){
Toast.makeText(this,"这是普通的方法~",Toast.LENGTH_LONG).show();
}
//定义静态方法
public static void static_method(){
Toast.makeText(context,"静态方法~",Toast.LENGTH_LONG).show();
}
/**
* 调用so层,使用so层代码调用java层的函数方法
*/
private native String soCallJavaFunction();
}
2.生成头文件,重命名.h文件并移动到src同级的jni目录(我这里重命名testJni.h)并创建.c文件
3.编写C代码
//调用java层的方法
JNIEXPORT jstring JNICALL Java_com_example_mypc_myxphook_MainActivity_soCallJavaFunction
(JNIEnv *env, jobject obj){
//---------------------------------调用普通方法-------------------------------------------
//查找Java的Class类返回一个jclass,env 第二个参数为类的路径
//JNI原方法 jclass (*FindClass)(JNIEnv*, const char*);
jclass clazz = (*env)->FindClass(env,"com/example/mypc/myxphook/MainActivity");
//获取普通方法ID env class java方法名 返回值类型 void为()V
//JNI 原方法 jmethodID (*GetMethodID)(JNIEnv*, jclass, const char*, const char*);
jmethodID _jmethodID = (*env)->GetMethodID(env, clazz, "_method", "()V");
//调用普通方法,env obj 方法id 返回值类型+签名
//JNI 原方法 void (*CallVoidMethod)(JNIEnv*, jobject, jmethodID, ...);
(*env)->CallVoidMethod(env,obj, _jmethodID);
//---------------------------------调用静态方法-------------------------------------------
//获取静态方法ID env,class,方法名,签名返回值
//JNI 原方法 jmethodID (*GetStaticMethodID)(JNIEnv*, jclass, const char*, const char*);
jmethodID _jstaticmethodID = (*env)->GetStaticMethodID(env, clazz, "static_method", "()V");
//调用java静态方法 env,class,方法ID
//JNI原方法 void (*CallStaticVoidMethod)(JNIEnv*, jclass, jmethodID, ...);
(*env)->CallStaticVoidMethod(env, clazz, _jstaticmethodID);
return (*env)->NewStringUTF(env,"1");
//---------------------------------完 毕------------------------------------------------
}
3.Java层调用native函数
友情提示:值得注意的是在Java层调用Toast.makeText如果是在静态方法内调用,第一参数Context需要在调用本方法之前传入一个静态的且初始化的context的对象
3.运行结果如下:
在浏览的同时希望给予作者打赏,来支持作者的服务器维护费用.一分也是爱~