安卓JNI--JNI底层C回调Java方法

来源:互联网 发布:淘宝新店推广 编辑:程序博客网 时间:2024/05/01 00:57

Google官方JNI指导下载:http://download.csdn.net/detail/muyang_ren/9344131

XML布局

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context="com.example.lianghuiyong.myapplication.MainActivity"    android:orientation="vertical">    <TextView        android:id="@+id/text1"        android:layout_width="wrap_content"        android:layout_height="wrap_content" />    <TextView        android:id="@+id/text2"        android:layout_width="wrap_content"        android:layout_height="wrap_content" /></LinearLayout>

Java文件代码

package com.example.lianghuiyong.myapplication;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.widget.TextView;public class MainActivity extends AppCompatActivity {    static {        System.loadLibrary("test-jni");    }    public native void test1();    public native void test2();    public String text2string = null;    public TextView textView1 = null;    public TextView textView2 = null;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        textView1 =(TextView) findViewById(R.id.text1);        textView2 =(TextView) findViewById(R.id.text2);        test1();//JNI回调settextview方法改变textView内容        test2();//JNI回调text2string变量改变text2string内容        textView2.setText(text2string);    }    public void settextview(String string){        textView1.setText(string);    }}

JNI 常用类型对应
这里写图片描述

JNI 数组类型对应
这里写图片描述

JNI GetMethodID第四个参数参考
这里写图片描述

JNI文件

#include <jni.h>#include <stdio.h>#include <android/log.h>JNIEXPORT void JNICALLJava_com_example_lianghuiyong_myapplication_MainActivity_test1(JNIEnv *env, jobject instance) {    // TODO    //找到com.example.lianghuiyong.myapplication.MainActivity类在JNI层中对应的env实例    jclass mainactivity = (*env)->FindClass(env ,"com/example/lianghuiyong/myapplication/MainActivity");    //jmethodID:查找到类的方法的ID,取出MainActivity类中settextview方法,    //第四个参数V为Java中settextview方法的返回类型,Ljava/lang/String;为参数类型    jmethodID textview1 = (*env)->GetMethodID(env,mainactivity,"settextview","(Ljava/lang/String;)V");    jstring hello = (*env)->NewStringUTF(env,"hello jni test1");    (*env)->CallVoidMethod(env,instance,textview1,hello);}JNIEXPORT void JNICALLJava_com_example_lianghuiyong_myapplication_MainActivity_test2(JNIEnv *env, jobject instance) {    // TODO    //test2刚开始的时候想查到Java的属性textView2后,调用textView2的setText()的方法,但是JNI是找不到这个方法。    //这里就用个简单的方法改变变量text2string的值,我们也可以在Java里建一个方法,使用handler bundle来实现。然后底层传参并回调这个方法。    //jclass:查找线程相关env的类    //找到com.example.lianghuiyong.myapplication.MainActivity类在JNI层中对应的env实例    jclass mainactivity = (*env)->FindClass(env ,"com/example/lianghuiyong/myapplication/MainActivity");    //jfieldID:查找到类的成员的ID    jfieldID textview2 = (*env)->GetFieldID(env,mainactivity,"text2string","Ljava/lang/String;");    jstring hello = (*env)->NewStringUTF(env,"hello jni test2");    (*env)->SetObjectField(env,instance,textview2,hello);}

这里写图片描述

Android studio 配置JNI:http://blog.csdn.net/muyang_ren/article/details/50160241

0 0
原创粉丝点击