android开发 如何在jni本地代码 访问自己写的类。如何使用env->findclass

android开发 如何在jni本地代码 访问自己写的类。如何使用env->findclass,第1张

jclass GpsInfoClass = env->FindClass("com/parser/GPSINFO");

jfieldID ID_bValid = env->GetFieldID(GpsInfoClass,"bValid","I");

jfieldID ID_bSpeed = env->GetFieldID(GpsInfoClass,"bSpeed","I");

env->SetIntField(_obj,ID_bValid,(jint)infobValid);

env->SetIntField(_obj,ID_bSpeed,(jint)infobSpeed);

return _obj;

以上就可以了。但是不知道你的BYTE是自定义的什么类型,如果是char之类的,就另外想办法转换成jint。其中 _obj 变量是public native GPSINFO getGpsInfo();这个本地方法在C代码中的参数:JNIEXPORT jobject JNICALL Java_com_parser_GPSINFO_ getGpsInfo(JNIEnv env, jobject _obj)

对于java传递进来的java对象模型,c要加载java类的原型,根据创建相应的c对象,获取java对象的方法的id,然后调用java对象的方法。比如有个java类customer对象作为jni参数传递到c程序,customer有方法String getName()。

JNIEXPORT jobject JNICALL Java_com_oracle_estt_sc_db_impl_SCQueryODBC__1getCustomer

(JNIEnv env, jobject, jobject customer){

jmethodID methodId;

//获得customer对象的句柄

jclass cls_objClass=env->GetObjectClass(customer);

//获得customer对象中特定方法getName的id

methodId=env->GetMethodID(cls_objClass,"getName","()Ljava/lang/String;");

//调用customer对象的特定方法getName

jstring js_name=(jstring)env->CallObjectMethod(customer,methodId,NULL);

}

然后C向java传递对象方法如下:

JNIEXPORT jobject JNICALL Java_perfecter_jni_LoadJni_getJavaObj(JNIEnv env,

jobject obj){

jclass clazz=env->FindClass("perfecter/jni/MyObj");

if(clazz==0)

return 0;

jobject jobj=env->AllocObject(clazz);

jfieldID fieldId=env->GetFieldID(clazz,"name","Ljava/lang/String;");

env->SetObjectField(jobj,fieldId,env->NewStringUTF("wahaha"));

return jobj;

}

java对应的native方法申明public static native MyObj getJavaObj();

我以前做的代码,你参考下,我把jni有关资料发给你发邮箱了,请查收

// JniC2Javacpp : Defines the entry point for the console application

//

#include "stdafxh"

using namespace std;

int main()

{

JavaVMOption options[1]; // 具有用于 JVM 的各种选项设置

JNIEnv env; //表示 JNI 执行环境

JavaVM jvm; //是指向 JVM 的指针,主要使用这个指针来创建、初始化和销毁 JVM

JavaVMInitArgs vm_args; //表示可以用来初始化 JVM 的各种 JVM 参数

long status; //创建JVM是否成功

jclass cls; // 指定对象的类定义(jclass)

jmethodID mid; // 调用方法的定义(jmethodID)

jint square;

jint square2;

jobject jobj;

//设置参考jar包,可以修改

options[0]optionString = "-Djavaclasspath=;/powerAuthorityjar;/sqljdbcjar;/log4j-1214jar;/frameworkjar;/commons-loggingjar;/log4jproperties;/appContextxml;/powerAuthoritylog";

vm_argsversion = JNI_VERSION_1_2;

vm_argsnOptions = 1;

vm_argsoptions = options;

status = JNI_CreateJavaVM(&jvm, (void)&env, &vm_args); //创建jvm ,成功返回0,不成功返回JNI_ERR

if (status != JNI_ERR){ //创建jvm成功

//获得一个实例对象

cls = env->FindClass("powersys/util/JNITools"); //获取指定对象的类定义(jclass)

if(cls !=0) {

mid = env->GetMethodID(cls,"<init>","()V");

if(mid !=0){

jobj=env->NewObject(cls,mid);

std::cout << "init ok " << mid << std::endl;

}

//调用登录验证

mid = env->GetMethodID( cls, "checkLogin", "(Ljava/lang/String;Ljava/lang/String;)I"); //读取要调用方法的定义(jmethodID)

if(mid !=0){

square = env->CallIntMethod(jobj,mid,env->NewStringUTF(""),env->NewStringUTF("111"));//调用方法

std::cout << square << std::endl;

square = env->CallIntMethod(jobj,mid,env->NewStringUTF("admin"),env->NewStringUTF(""));//调用方法

std::cout << square << std::endl;

square = env->CallIntMethod(jobj,mid,env->NewStringUTF("admin1"),env->NewStringUTF("admin"));//调用方法

std::cout << square << std::endl;

square = env->CallIntMethod(jobj,mid,env->NewStringUTF("abcd"),env->NewStringUTF("1234056"));//调用方法

std::cout << square << std::endl;

square = env->CallIntMethod(jobj,mid,env->NewStringUTF("abcd"),env->NewStringUTF("123456"));//调用方法

std::cout << square << std::endl;

square = env->CallIntMethod(jobj,mid,env->NewStringUTF("admin"),env->NewStringUTF("admin"));//调用方法

std::cout << square << std::endl;

square = env->CallIntMethod(jobj,mid,env->NewStringUTF("test"),env->NewStringUTF("123456"));//调用方法

std::cout << square << std::endl;

std::cout << "checkLogin ok " <<mid<< std::endl;

}

//调用检查是否有权 *** 作

mid = env->GetMethodID( cls, "checkAuthority","(Ljava/lang/String;Ljava/lang/String;)I");

if(mid !=0){

square2 = env->CallIntMethod(jobj, mid, env->NewStringUTF("test"),env->NewStringUTF("powersysframejdialogAddUserJDialog"));

std::cout << square2 << std::endl;

square2 = env->CallIntMethod(jobj, mid, env->NewStringUTF("test"),env->NewStringUTF("powersysframejdialogEditUserJDialog"));

std::cout << square2 << std::endl;

square2 = env->CallIntMethod(jobj, mid, env->NewStringUTF(""),env->NewStringUTF("powersysframejdialogAddUserJDialog"));

std::cout << square2 << std::endl;

square2 = env->CallIntMethod(jobj, mid, env->NewStringUTF("admin"),env->NewStringUTF("powersysframejdialogAddUserJDialog"));

std::cout << square2 << std::endl;

square2 = env->CallIntMethod(jobj, mid, env->NewStringUTF("da3"),env->NewStringUTF("powersysframejdialogAddUserJDialog"));

std::cout << square2 << std::endl;

square2 = env->CallIntMethod(jobj, mid, env->NewStringUTF("bush"),env->NewStringUTF("powersysframejdialogAddUserJDialog"));

std::cout << square2 << std::endl;

std::cout << "checkAuthority ok" << std::endl;

}

}

jvm->DestroyJavaVM();

return 0;

}

else

return -1;

}

// JniC2Javacpp : Defines the entry point for the console application

//

#include "stdafxh"

using namespace std;   

  

int main()   

{

 

 JavaVMOption options[1];   // 具有用于 JVM 的各种选项设置

 

 JNIEnv env;   //表示 JNI 执行环境

 

 JavaVM jvm;   //是指向 JVM 的指针,主要使用这个指针来创建、初始化和销毁 JVM

 

 JavaVMInitArgs vm_args; //表示可以用来初始化 JVM 的各种 JVM 参数

 long status; //创建JVM是否成功

 

 jclass cls;   // 指定对象的类定义(jclass) 

 

 jmethodID mid;   // 调用方法的定义(jmethodID) 

 

 jint square;   

 

 jint square2;

 

 jobject jobj;   

 //设置参考jar包,可以修改

 options[0]optionString = "-Djavaclasspath=;/powerAuthorityjar;/sqljdbcjar;/log4j-1214jar;/frameworkjar;/commons-loggingjar;/log4jproperties;/appContextxml;/powerAuthoritylog";   

vm_argsversion = JNI_VERSION_1_2;   

 vm_argsnOptions = 1;   

 

 vm_argsoptions = options; 

status = JNI_CreateJavaVM(&jvm, (void)&env, &vm_args);   //创建jvm ,成功返回0,不成功返回JNI_ERR

 

 if (status != JNI_ERR){ //创建jvm成功

  //获得一个实例对象

  cls = env->FindClass("powersys/util/JNITools");  //获取指定对象的类定义(jclass) 

  

  if(cls !=0) { 

   mid = env->GetMethodID(cls,"<init>","()V"); 

   

   if(mid !=0){ 

    

    jobj=env->NewObject(cls,mid); 

    

    std::cout << "init ok " << mid << std::endl;

   

   } 

//调用登录验证

   mid = env->GetMethodID( cls, "checkLogin", "(Ljava/lang/String;Ljava/lang/String;)I"); //读取要调用方法的定义(jmethodID) 

   

   if(mid !=0){ 

    square = env->CallIntMethod(jobj,mid,env->NewStringUTF(""),env->NewStringUTF("111"));//调用方法     

    std::cout << square << std::endl;

    square = env->CallIntMethod(jobj,mid,env->NewStringUTF("admin"),env->NewStringUTF(""));//调用方法     

    std::cout << square << std::endl;

    square = env->CallIntMethod(jobj,mid,env->NewStringUTF("admin1"),env->NewStringUTF("admin"));//调用方法     

    std::cout << square << std::endl;

    square = env->CallIntMethod(jobj,mid,env->NewStringUTF("abcd"),env->NewStringUTF("1234056"));//调用方法     

    std::cout << square << std::endl;

    square = env->CallIntMethod(jobj,mid,env->NewStringUTF("abcd"),env->NewStringUTF("123456"));//调用方法     

    std::cout << square << std::endl;

    square = env->CallIntMethod(jobj,mid,env->NewStringUTF("admin"),env->NewStringUTF("admin"));//调用方法     

    std::cout << square << std::endl;

    square = env->CallIntMethod(jobj,mid,env->NewStringUTF("test"),env->NewStringUTF("123456"));//调用方法     

    std::cout << square << std::endl;

    std::cout << "checkLogin ok " <<mid<< std::endl;

   }  

//调用检查是否有权 *** 作

   mid = env->GetMethodID( cls, "checkAuthority","(Ljava/lang/String;Ljava/lang/String;)I"); 

   

   if(mid !=0){

square2 = env->CallIntMethod(jobj, mid, env->NewStringUTF("test"),env->NewStringUTF("powersysframejdialogAddUserJDialog")); 

    std::cout << square2 << std::endl;  

    square2 = env->CallIntMethod(jobj, mid, env->NewStringUTF("test"),env->NewStringUTF("powersysframejdialogEditUserJDialog")); 

    std::cout << square2 << std::endl;  

    square2 = env->CallIntMethod(jobj, mid, env->NewStringUTF(""),env->NewStringUTF("powersysframejdialogAddUserJDialog")); 

    std::cout << square2 << std::endl;  

    square2 = env->CallIntMethod(jobj, mid, env->NewStringUTF("admin"),env->NewStringUTF("powersysframejdialogAddUserJDialog")); 

    std::cout << square2 << std::endl;  

    square2 = env->CallIntMethod(jobj, mid, env->NewStringUTF("da3"),env->NewStringUTF("powersysframejdialogAddUserJDialog")); 

    std::cout << square2 << std::endl;  

    square2 = env->CallIntMethod(jobj, mid, env->NewStringUTF("bush"),env->NewStringUTF("powersysframejdialogAddUserJDialog")); 

    std::cout << square2 << std::endl;  

std::cout << "checkAuthority ok" << std::endl;

   }

  }

  

  jvm->DestroyJavaVM();     

  

  return 0; 

 }

 

 else 

  

  return -1;  

}

c和c++的一些不同点(从语言本身的角度):

1)c++源于c,c++最重要的特性就是引入了面向对象机制,class关键字。

2)c++中,变量可以再任何地方声明;c中,局部变量只能在函数开头声明。

3)c++中,const型常量是编译时常量;c中,const常量只是只读的变量。

4)c++有&引用;c没有

5)c++的struct声明自动将结构类型名typedef;c中struct的名字只在结构标签名字空间中,不是作为一种类型出现

6)c语言的main函数可以递归调用;c++中则不可以

7)c中,void 可以隐式转换成其他指针类型;c++中要求限时转换,否则编译通不过C#是微软弄的一个语言,继承了C和C++的许多东西,但和两者基本上已完全不一样了你可以把它当作一种全新的语言来学 当然,c++与c标准都在发展,c99标准更使c免于成为c++的子集,推出了诸如可变长数组、用字符串字面量给数组赋值等的特性没有C+语言可能你写错了吧是c#

你的JNI接口定义错误,在Java层传入了4个参数,你的JNI接口只有一个参数。

JNIEXPORT jint JNICALL Java_org_jniInterface_CommitTask_myReceiveMsg 

        (JNIEnv env, jclass obj, jinit, jint, jstring, jobject jobj)

前两个参数是默认的,从第三个开始是你需要对应的java接口的参数

以上就是关于android开发 如何在jni本地代码 访问自己写的类。如何使用env->findclass全部的内容,包括:android开发 如何在jni本地代码 访问自己写的类。如何使用env->findclass、java 通过jni 向 c 传递一个 java 对象, c 如何取得这个对象的属性值、关于 JNI 的 FindClass等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/10082382.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存