美文网首页
JNI 代码

JNI 代码

作者: heiheiwanne | 来源:发表于2016-08-22 15:29 被阅读35次

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);
}


相关文章

  • Android 添加JNI 开发能力

    JNI 与 NDK 区别JNI:JNI是一套编程接口,用来实现Java代码与本地的C/C++代码进行交互;NDK:...

  • jni新手笔记二:java调用c++

    jni作为 java代码与c/c++ 代码之间的桥梁,通过jni可以实现java代码和c/c++代码互相调用 在 ...

  • JNI代码实践

    JNI代码实践 [TOC] 说明 关于jni代码的cmake构建脚本,kotlin如何声明和使用native方法,...

  • 常用的串口JNI方法

    打开串口 定义的JNI方法 c代码 设置波特率方法 关闭串口 定义的JNI方法 c代码 读取串口数据 定义的JNI...

  • 2.JNI.h解析

    什么是JNI? JNI 是java本地开发接口.JNI 是一个协议,这个协议用来沟通java代码和外部的本地代码(...

  • JNI 常见用法

    一、Java 代码 和JNI代码通信 Java代码通过JNI接口 调用 C/C++方法 1、首先我们需要在Java...

  • JNI 代码

    1.Foo.java 2.FooCDiaoJava.java 3.jniCodeCDiaoJava.c

  • UVC系列5-编写Android jni代码实现控制PTZ

    在Android kernel层完成定制之后,需要写app实现对摄像头的控制,主要通过jni代码实现。在jni代码...

  • JNI简介

    JNI和NDK? JNI (Java Native Interface)是一套编程接口,用来实现java代码和其他...

  • JNI知识点总结

    JNI概念 JNI是本地语言编程接口。它允许运行在JVM中的Java代码和用C、C++或汇编写的本地代码相互操作。...

网友评论

      本文标题:JNI 代码

      本文链接:https://www.haomeiwen.com/subject/rrcgsttx.html