Android NDK开发 JNI操作java构造方法,普通方法,静态方法(七)
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构造方法,普通方法,静态方法(七)的更多相关文章
- Android Studio NDK开发-JNI调用Java方法
相对于NDK来说SDK里面有更多API可以调用,有时候我们在做NDK开发的时候,需要在JNI直接Java中的方法和变量,比如callback,系统信息等.... 如何在JNI中调用Java方法呢?就需 ...
- Android NDK开发----- JNI多线程
一.概述 JNI编程和Linux上的C/C++编程还是挺相似的,每次java调用JNI中的函数时都会传入有关JVM的一些参数(如JNIEnv,jobject),每次JNI回调java中的方法时都要通过 ...
- Android NDK开发篇:Java与原生代码通信(数据操作)
虽然说使用NDK可以提高Android程序的执行效率,但是调用起来还是稍微有点麻烦.NDK可以直接使用Java的原生数据类型,而引用类型,因为Java的引用类型的实现在NDK被屏蔽了,所以在NDK使用 ...
- Android NDK开发三:java和C\C++交互
转自:http://www.cnblogs.com/shangdahao/archive/2013/05/02/3053971.html 1.定义native方法并加载动态链接库: public cl ...
- Android NDK开发篇:Java与原生代码通信(异常处理)
一.捕获异常 异常处理是Java中的功能,在Android中使用SDK进行开发的时候经常要用到.Android原生代码在执行过程中如果遇到错误,需要检测,并抛出异常给Java层.执行原生代码出现了问题 ...
- Android NDK开发 JNI类型签名和方法签名(六)
在Java存在两种数据类型: 基本类型 和 引用类型 ,大家都懂的 . 在JNI的世界里也存在类似的数据类型,与Java比较起来,其范围更具严格性,如下: 1.primitive types ---- ...
- Android NDK开发 Jni中打日志LOG(二)
HelloJni.c文件中,加入头文件和函数声明.最终文件如下: #include <jni.h> #include <string.h> #include<androi ...
- Android NDK开发篇:Java与原生代码通信(原生方法声明与定义与数据类型)
Java与原生代码通信涉及到原生方法声明与定义.数据类型.引用数据类型操作.NIO操作.访问域.异常处理.原生线程 1.原生方法声明与定义 关于原生方法的声明与定义在上一篇已经讲一点了,这次详细分析一 ...
- Android NDK开发 Jni中Debug(三)
下载LLDB 配置Android Native - Debugger 调式结果如下 #include <jni.h> #include <string.h> #include& ...
随机推荐
- Luogu 2322 [HNOI2006]最短母串问题
唔,太菜了,弄了好几个小时. 状压dp,设$f_{s, i}$表示选了集合$s$,以$i$结尾的最短长度,设$g_{i, j}$表示串$i$的后缀和串$j$的前缀的最长匹配长度. $f_{s, i} ...
- 4.传统的MVC
通过document view设计,我们把应用程序的状态(clicktimes)从一个简单的类设计中抽取出来.下一个目标是抽取转化主要的事件(这个例子里面是鼠标点击之后释放)为应用程序逻辑从而改变应用 ...
- Socket编程--并发server
Socket地址复用 int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen); int ...
- 第4章 jQuery中的事件和动画
4.1 jQuery中的事件 4.1.1 加载DOM jQuery就是用 `$(document).ready()方法来代替传统JavaScript的window.onload方法的. 1.执行时机 ...
- [译]Javascript中的递归函数
本文翻译youtube上的up主kudvenkat的javascript tutorial播放单 源地址在此: https://www.youtube.com/watch?v=PMsVM7rjupU& ...
- 通过ADB命令行卸载或删除你的Android设备中的应用(转载)
转自:http://mytiankong.com/?p=11755 如果你对你的Android设备在与命令行的交互间有一定的兴趣,那你可能想学习一些使用ADB卸载设备中已安装应用的技巧.为了使这种方法 ...
- 第一个SpringMVC程序(最简单的)
注册中央调度器,这个中央调度器就是org.springframework.web.servlet.DispatcherServlet这个类(web.xml servlet-name节点的名字,必须 ...
- javaScript实现轮播图
一.需求分析 在首页完成对轮播图的效果实现,完成自动切换图片的功能. 二.技术分析 获取元素 document.getElementById(“id 名称”) 事件(onload) 定时操作: set ...
- SQL的发展史
在20世纪60年代,网状数据库系统(如CODASYL)和分层数据库系统(如IMS TM)是用于自动化银行业务.记帐和订单处理系统的一流技术,这些系统是由于商业大型计算机的引入才启用的.而SQL是在70 ...
- linux手动安装配置 mysql5.7
本文原出处地址 https://www.cnblogs.com/mujingyu/p/7689116.html 一.安装前的检查 1.1 检查 linux 系统版本 [root@localhost ...