JNI 代码

2016-08-22  本文已影响35人  heiheiwanne

1.Foo.java

public class Foo {

    public Foo(){
        System.loadLibrary("JniTest");
    }

    native void foo1();
    native void foo2(int a,String b);
    native String get_String();

}

2.FooCDiaoJava.java

package com.example.demo.jnidemo;

import android.widget.Toast;

/**
 * Created by bjhl on 16/8/20.
 */
public class FooCDiaoJava {

    native void cDiaojavaJingTai();

    native void javaDiaoC1();

    public void javac2(){
        javaDiaoC2();
    }

    native void javaDiaoC2();

    native void javaDiaoC3();

    /**
     * 让c调用时同时反调java方法
     * 对应cNewObjectDiaoJava
     */
    native void cNewObjectDiaoJava();

    /**
     * 提供给c调用的静态方法
     * @param str
     */
    public static void cDiao(String str){
        showToast("c调用java静态方法" + str);
    }

    public void cDiaoJava1(){
       showToast("这是c调用java语言 cDiaoJava1");
    }

    public void cDiaoJava2(String str){
        showToast("这是c调用java语言2 有参数"+str);
    }

    public String cDiaoJava3(int i){
        String result = ""+Math.pow(i,2);
        showToast("这是c调用java语言 有返回值"+result);
        return result;
    }

    /**
     * 让c通过new对象调用的非静态方法对应
     * cNewObjectDiaoJava
     */
    public void cNewObjDJ(){
        showToast("c通过new对象的方式调用函数");
    }

    public static void showToast(String str){
        Toast.makeText(MainActivity.activity,str,Toast.LENGTH_LONG).show();
    }
}

3.jniCodeCDiaoJava.c

//
// Created by bjhl on 16/8/20.
//
#include "com_example_demo_jnidemo_FooCDiaoJava.h"
#include "jni.h"
#include "android/log.h"

#define LOG_TAG "System.out"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)


/**
 * c调用java静态方法成功
 *
 * 命令 javap -s FooCDiaoJava  获取方法参数的签名  (其中-s后的.java对象)
 */

JNIEXPORT void JNICALL Java_com_example_demo_jnidemo_FooCDiaoJava_cDiaojavaJingTai
        (JNIEnv *env, jobject jobject1){
     //获取类Class对象
     jclass clazz = (*env)->FindClass(env,"com/example/demo/jnidemo/FooCDiaoJava");

     //获取java函数的id值
     jmethodID id = (*env)->GetStaticMethodID(env,clazz,"cDiao","(Ljava/lang/String;)V");

    if(id==0){
        LOGD("find method1 error");
        return;
    }
     //定义参数
     jstring msg = (*env)->NewStringUTF(env,"jniCodeDiao.c calljavaMethod");

     //进行方法的调用
     (*env)->CallStaticVoidMethod(env,clazz,id,msg);
}


/**
 * c调用java中的非静态方法  无参也无返回值
 * 直接通过参数中的对象
 */
JNIEXPORT void JNICALL Java_com_example_demo_jnidemo_FooCDiaoJava_javaDiaoC1
        (JNIEnv *env, jobject obj){
     //获得obj对象
     jclass cla = (*env)->GetObjectClass(env,obj);

     jmethodID id = (*env)->GetMethodID(env,cla,"cDiaoJava1","()V");

//     (*env)->CallVoidMethod(env,cla,id);   这种写法是错误的 我把jobject对象传错了
     (*env)->CallVoidMethod(env,obj,id);
}

/**
 * c调用java中的非静态方法 有参 无返回值
 */
JNIEXPORT void JNICALL Java_com_example_demo_jnidemo_FooCDiaoJava_javaDiaoC2
        (JNIEnv *env, jobject obj){
     jclass cla = (*env)->GetObjectClass(env,obj);
     jmethodID id = (*env)->GetMethodID(env,cla,"cDiaoJava2","(Ljava/lang/String;)V");
     jstring str = (*env)->NewStringUTF(env,"c的参数");
     (*env)->CallVoidMethod(env,obj,id,str);
}

/**
 * 这是c调用java语言 有返回值有参数
 */
JNIEXPORT void JNICALL Java_com_example_demo_jnidemo_FooCDiaoJava_javaDiaoC3
        (JNIEnv *env, jobject obj){
     //得到传入对对象的Class对象
     jclass clazz = (*env)->GetObjectClass(env,obj);
     jmethodID methodId = (*env)->GetMethodID(env,clazz,"cDiaoJava3","(I)Ljava/lang/String;");
     jstring str = (*env)->CallObjectMethod(env,obj,methodId,2);
     //经测返回值可用
}


/**
 * c通过new对象的方式调用java的非静态方法
 */
JNIEXPORT void JNICALL Java_com_example_demo_jnidemo_FooCDiaoJava_cNewObjectDiaoJava
        (JNIEnv *env, jobject obj){

     //C 中映射 类
     jclass clazz = (*env)->FindClass(env,"com/example/demo/jnidemo/FooCDiaoJava");
     //C中新建对象
     jmethodID construction_id  = (*env)->GetMethodID(env,clazz,"<init>","()V");
     jobject javaObj = (*env)->NewObject(env,clazz,construction_id);
     //C 中映射非静态方法
     jmethodID foocdjanewobj = (*env)->GetMethodID(env,clazz,"cNewObjDJ","()V");

     //C 中调用 Java非静态 的 方法
     (*env)->CallVoidMethod(env,javaObj,foocdjanewobj);
}


上一篇 下一篇

猜你喜欢

热点阅读