Android NDK开发 JNI操作java普通、静态、构造方法

1.Jni实例化一个Java类的实例jobject

1.通过FindClas( ),获取Java类的的jclass
2.通过GetMethodID( ),获取java类的构造方法ID
3.通过NewObject( ),实例化java类并传递参数

2. 通过jobject访问Java类的普通方法

1.获取类名
  如果传入的是jobject需要通过GetObjectClass(jobject)获取jclass

如果没有jobject需要通过FindClass("javapackage") 来获类的jclass

2.获取类的方法的jmethodID

3. 通过返回值来调用不通过的方法来调用传入jobject,jmethodID还有参数。 这里注意参数都jint,jstirng,jlong.不要直接传int,long这种类型的

例如

返回值是

无返回值的CallVoidMethod

基本类型的可以直接找到对应的 int 对应CallIntMethod( );boolean对应CallBooleanMethod ( )...

引用类型的方法返回类型是CallObjectMethod。例如String类型调用CallObjectMethod,然后强制转换为jstring

Java层返回值                  方法族                                            本地返回类型NativeType

返回值为void :          CallVoidMethod( )   A / V                               (无)

返回值为引用类型:     CallObjectMethod( )                              jobect

返回值为boolean :    CallBooleanMethod ( )                           jboolean

返回值为byte :          CallByteMethod( )                                  jbyte

返回值为char  :         CallCharMethod( )                                 jchar

返回值为short             CallShortMethod( )                                jshort

返回值为int   :          CallIntMethod( )                                     jint

返回值为long:          CallLongMethod()                                   jlong

返回值为float :         CallFloatMethod()                                   jfloat

返回值为double:      CallDoubleMethod()                                jdouble

3. 通过jobject访问Java类的静态方法

1.获取类名
  如果传入的是jobject需要通过GetObjectClass(jobject)获取jclass

如果没有jobject需要通过FindClass("javapackage") 来获类的jclass

2.获取类的静态方法的GetStaticMethodID

3.和上面普通一样只是范围时候。都要调用静态的。

例如String 类型的CallStaticObjectMethod

activity

package com.tmf.ndk.type;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView; public class MainActivity extends AppCompatActivity {
public final static String TAG = "MainActivity";
// Used to load the 'native-lib' library on application startup.
static {
System.loadLibrary("native-lib");
} @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Student jniNewobj=accessConstructMethod();
Log.i(TAG, "jni new student=" + jniNewobj.toString());
Student student=new Student() ;
String nameAge=getNameAge(student);
Log.i(TAG, "Jni 初始的=" + nameAge);
String nameAge1=setNameAge(student);
Log.i(TAG, "Jni 处理的=" + nameAge1);
Log.i(TAG, "student=" + student.toString());
TextView tv = (TextView) findViewById(R.id.sample_text);
tv.setText(getStaticInfo()); }
//构造方法
public native Student accessConstructMethod();
//JNI 调用对象
public native String getNameAge(Student student);
//JNI 给对象复制
public native String setNameAge(Student student);
//调用静态方法
public native String getStaticInfo(); }

student

package com.tmf.ndk.type;

import android.util.Log;

public class Student {
public final static String TAG = "Student";
String name;
int age; public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public int getAge() {
Log.i(TAG, "getAge=" + age);
return age;
}
public void setAge(int age) {
this.age = age;
Log.i(TAG, "setAge=" + age);
}
public String getName() {
Log.i(TAG, "getName=" + name);
return name;
}
public void setName(String name1) {
this.name = name1;
Log.i(TAG, "setName=" + name);
}
@Override
public String toString() {
String str = "name=" + name + " age=" + age;
return str;
}
public static String getInfo(String name, int age) {
String str = "静态方法 name=" + name + " age=" + age;
Log.i(TAG, "getInfo=" + str);
return str;
}
}

jni

#include <jni.h>
extern "C"{ JNIEXPORT jobject JNICALL
Java_com_tmf_ndk_type_MainActivity_accessConstructMethod(JNIEnv *env, jobject instance);
JNIEXPORT jstring JNICALL
Java_com_tmf_ndk_type_MainActivity_getNameAge(JNIEnv *env, jobject instance, jobject student);
JNIEXPORT jstring JNICALL
Java_com_tmf_ndk_type_MainActivity_setNameAge(JNIEnv *env, jclass type, jobject student);
JNIEXPORT jstring JNICALL
Java_com_tmf_ndk_type_MainActivity_getStaticInfo(JNIEnv *env, jobject instance); } JNIEXPORT jobject JNICALL
Java_com_tmf_ndk_type_MainActivity_accessConstructMethod(JNIEnv *env, jobject instance) {
//获取Student的jclass
jclass studentClass=env->FindClass("com/tmf/ndk/type/Student");
//获取Student的构造方法ID
jmethodID studentCont=env->GetMethodID(studentClass,"<init>","(Ljava/lang/String;I)V");
//实例化Student并传递参数
jstring name = env->NewStringUTF("JIN 构造方法新建对象 宝强");
jint age=;
jobject student= env->NewObject(studentClass,studentCont,name,age);
return student;
} JNIEXPORT jstring JNICALL
Java_com_tmf_ndk_type_MainActivity_getNameAge(JNIEnv *env, jobject instance, jobject student) {
// jclass studentClass=env->FindClass("com/tmf/ndk/type/Student");
//通过实例类获取类名com.tmf.ndk.type.Student
jclass studentClass=env->GetObjectClass(student);
//获取类的getName方法名
jmethodID getName=env->GetMethodID(studentClass,"getName","()Ljava/lang/String;");
//通过实例类调用getName方法名
jstring name=(jstring)env->CallObjectMethod(student,getName); //getAge
jmethodID getAge=env->GetMethodID(studentClass,"getAge","()I");
//通过实例类调用getAge方法名
jint age=env->CallIntMethod(student,getAge); //toString
jmethodID toString=env->GetMethodID(studentClass,"toString","()Ljava/lang/String;");
//通过实例类调用toString方法名
jstring toStr=(jstring)env->CallObjectMethod(student,toString); const char *newStr = env->GetStringUTFChars(toStr, );
return env->NewStringUTF(newStr);
} JNIEXPORT jstring JNICALL
Java_com_tmf_ndk_type_MainActivity_setNameAge(JNIEnv *env, jclass type, jobject student) {
//通过实例类获取类名com.tmf.ndk.type.Student
jclass studentClass=env->GetObjectClass(student);
jmethodID setName=env->GetMethodID(studentClass,"setName","(Ljava/lang/String;)V");
jstring name = env->NewStringUTF("李四");
env->CallVoidMethod(student,setName,name);
//setAge
jmethodID setAge=env->GetMethodID(studentClass,"setAge","(I)V");
jint age=;
//setAge
env->CallVoidMethod(student,setAge,age);
//toString
jmethodID toString=env->GetMethodID(studentClass,"toString","()Ljava/lang/String;");
//通过实例类调用toString方法名
jstring toStr=(jstring)env->CallObjectMethod(student,toString); const char *newStr = env->GetStringUTFChars(toStr, );
return env->NewStringUTF(newStr); } JNIEXPORT jstring JNICALL
Java_com_tmf_ndk_type_MainActivity_getStaticInfo(JNIEnv *env, jobject instance) {
jclass studentClass=env->FindClass("com/tmf/ndk/type/Student");
jmethodID geInfo=env->GetStaticMethodID(studentClass,"getInfo","(Ljava/lang/String;I)Ljava/lang/String;");
jstring name = env->NewStringUTF("静态方法调用 老王");
jint age=;
jstring str=(jstring)env->CallStaticObjectMethod(studentClass,geInfo,name,age);
const char *newStr = env->GetStringUTFChars(str, );
return env->NewStringUTF(newStr);
}

Android NDK开发 JNI操作java构造方法,普通方法,静态方法(七)的更多相关文章

  1. Android Studio NDK开发-JNI调用Java方法

    相对于NDK来说SDK里面有更多API可以调用,有时候我们在做NDK开发的时候,需要在JNI直接Java中的方法和变量,比如callback,系统信息等.... 如何在JNI中调用Java方法呢?就需 ...

  2. Android NDK开发----- JNI多线程

    一.概述 JNI编程和Linux上的C/C++编程还是挺相似的,每次java调用JNI中的函数时都会传入有关JVM的一些参数(如JNIEnv,jobject),每次JNI回调java中的方法时都要通过 ...

  3. Android NDK开发篇:Java与原生代码通信(数据操作)

    虽然说使用NDK可以提高Android程序的执行效率,但是调用起来还是稍微有点麻烦.NDK可以直接使用Java的原生数据类型,而引用类型,因为Java的引用类型的实现在NDK被屏蔽了,所以在NDK使用 ...

  4. Android NDK开发三:java和C\C++交互

    转自:http://www.cnblogs.com/shangdahao/archive/2013/05/02/3053971.html 1.定义native方法并加载动态链接库: public cl ...

  5. Android NDK开发篇:Java与原生代码通信(异常处理)

    一.捕获异常 异常处理是Java中的功能,在Android中使用SDK进行开发的时候经常要用到.Android原生代码在执行过程中如果遇到错误,需要检测,并抛出异常给Java层.执行原生代码出现了问题 ...

  6. Android NDK开发 JNI类型签名和方法签名(六)

    在Java存在两种数据类型: 基本类型 和 引用类型 ,大家都懂的 . 在JNI的世界里也存在类似的数据类型,与Java比较起来,其范围更具严格性,如下: 1.primitive types ---- ...

  7. Android NDK开发 Jni中打日志LOG(二)

    HelloJni.c文件中,加入头文件和函数声明.最终文件如下: #include <jni.h> #include <string.h> #include<androi ...

  8. Android NDK开发篇:Java与原生代码通信(原生方法声明与定义与数据类型)

    Java与原生代码通信涉及到原生方法声明与定义.数据类型.引用数据类型操作.NIO操作.访问域.异常处理.原生线程 1.原生方法声明与定义 关于原生方法的声明与定义在上一篇已经讲一点了,这次详细分析一 ...

  9. Android NDK开发 Jni中Debug(三)

    下载LLDB 配置Android Native - Debugger 调式结果如下 #include <jni.h> #include <string.h> #include& ...

随机推荐

  1. SPOJ GSS7 - Can you answer these queries VII

    板的不能再板,链剖+线段树或者是LCT随便维护. 感觉唯一要注意的是跳链的时候要对$x$向上跳和$y$向上跳的情况分开讨论,而不能直接$swap$,因为只有两段接触的端点才能相互合并,而且每一次向上跳 ...

  2. Django框架 之 Cookie和Session初识

    Django框架 之 Cookie和Session初识 浏览目录 Cookie介绍 Django中的Cookie Session 一.Cookie介绍 1.Cookie产生的意义 众所周知,HTTP协 ...

  3. Redis面试考点

    什么是Redis? Redis 是一个基于内存的高性能key-value数据库. Redis的特点以及缺点? Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据 ...

  4. SDUT 2498 AOE网上的关键路径

    AOE网上的关键路径 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 一个无环的有向图称为无 ...

  5. Batch Normalization 与Dropout 的冲突

    BN或Dropout单独使用能加速训练速度并且避免过拟合 但是倘若一起使用,会产生负面效果. BN在某些情况下会削弱Dropout的效果 对此,BN与Dropout最好不要一起用,若一定要一起用,有2 ...

  6. 操作系统 Linux ex1 note

    ctrl + alt + T 命令行 ctrl + alt + F7 ctrl + alt + F1-6 ls 列出所有文件 / 根目录 ~ /home/username cd 切换路径 . 当前目录 ...

  7. Java50道经典习题-程序30 插入数字

    题目:有一个已经排好序的数组.现输入一个数,要求将它插入数组中后数组依然是排好序的.分析:首先判断此数是否大于最后一个数,然后再考虑插入中间的数的情况,插入后此元素之后的数,依次后移一个位置. imp ...

  8. 国内物联网平台(1):百度物接入IoT Hub

    国内物联网平台(1) ——百度物接入IoT Hub 马智 物接入IoT Hub - 架构 全托管的云服务,帮助建立设备与云端之间安全可靠的双向连接 支撑海量设备的数据收集.监控.故障预测等各种物联网场 ...

  9. JetBrains Rider 在 Mac 环境下将 cs 文件生成 exe

    因为自己的开发环境是 Mac + Rider 组合,想测试网络编程相关内容.想在Windows 虚拟机上运行一套代码来与Mac 机进行测试,但又不想在虚拟机上安装一套开发环境.最终找到的解决方案是通过 ...

  10. CloudStack网络概念

    转载:http://www.300wl.com/news/2016/0203/206663.html CloudStack网络模式分为简单网络(Basic Networking)和高级网络(Advan ...