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

原创 2015年12月05日 16:31:55

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 JNICALL
Java_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 JNICALL
Java_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

版权声明:博客地址:http://blog.csdn.net/muyang_ren,源码可以在我的github上找看看

相关文章推荐

JNI注册调用完整过程-安卓4.4

在Android系统中,JNI方法是以C/C++语言来实现的,然后编译在一个so文件里面,以我之前的例子为例Android Studio使用JNI,调用之前要加载到当前应用程序的进程的地址空间中: ...

如何在android的jni线程中实现回调

JNI回调是指在c/c++代码中调用java函数,当在c/c++的线程中执行回调函数时,会导致回调失败。 其中一种在Android系统的解决方案是: 把c/c++中所有线程的创建,由pthread...
  • xnwyd
  • xnwyd
  • 2012-03-16 11:38
  • 17461

JNI学习积累之三 ---- 操作JNI函数以及复杂对象传递

本文原创,转载请注明出处:http://blog.csdn.net/qinjuning          在掌握了JNI函数的使用和相关类型的映射后,以及知晓何利用javah...

安卓开发——JNI——回调java中的方法

JNI开发中 在C代码中回调java中的方法

Android NDK开发(五)——C代码回调Java代码

在上篇博客里了解了Java层是怎样传递数据到C层代码,并且熟悉了大部分的实际开发知识,基本上掌握这些就可以做一个基本的NDK开发了,但是光是了解Java回调C层的数据是不是还不够啊,考虑问题要考虑可逆...

JNI使用实例之C、C++ DLL回调java成员函数

使用场景描述如下: 1、使用java程序调用C开发的DLL,传入一个已封装的socket对象 2、在C开发的DLL中根据传入的对象调用java提供的recv()、send()函数发送数据 java...

Android开发 通过JNI实现JAVA与C/C++程序间的调用和回调

在一些Android应用的开发中,需要通过JNI和 Android NDK工具实现JAVA和C/C++之间的相互调用。        Java Native Interface (JNI)标准是jav...

linux C++ 多线程浅尝

学习了几天Linux多线程,大多是看的别人的博客,并试着写了个小例子,现在也把学到的一些东西记录下来,供以后查阅,属于初级入门的范围,望共勉。   进程是系统中程序执行和分配资源的基本单位,每个进程...

android Java与JNI层互相调用

Java层调用JNI中的函数首先在TextJNI.java层创建一个类TextJNI,类中使用一些native方法package com.example.androidjni; import andr...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)