jobjectjava的简单介绍

博主:adminadmin 2023-03-21 05:22:09 371

今天给各位分享jobjectjava的知识,其中也会对进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

在JNI中如何将jobject类型转换为jdouble类型

#include jni.h   

#include "com_test_Test.h"  

#include stdio.h   

#include stdlib.h   

#include strings.h   

  

//获取字符串   

JNIEXPORT void JNICALL Java_com_test_Test_sayHello(JNIEnv * env, jobject obj,   

  jstring s) {   

  

 char * str = (char *) (*env)-GetStringUTFChars(env, s, 0);   

 printf("\n c-string: hello - %s", str);   

  

}   

  

//获取,返回int   

JNIEXPORT jint JNICALL Java_com_test_Test_add(JNIEnv * env, jobject obj,   

  jint a, jint b) {   

 int i = a;   

 int j = b;   

 printf("\n c-int: %d - %d", i, j);   

 char str[256];   

 sprintf(str, "%d", i + j);   

 return (jint) i + j;   

}   

  

//获取,返回float   

JNIEXPORT jfloat JNICALL Java_com_test_Test_getFloat(JNIEnv * env, jobject obj,   

  jfloat f) {   

 float fl = f;   

 printf("\n c-float: %3f", fl);   

  

 fl = 200.555;   

 return (jfloat) fl;   

}   

  

//获取,返回 double   

JNIEXPORT jdouble JNICALL Java_com_test_Test_getDouble(JNIEnv * env,   

  jobject obj, jdouble dou) {   

 double d = dou;   

 printf("\n c-double: %3f", d);   

  

 d = 800.88;   

 return (jdouble) d;   

}   

  

//获取,返回boolean   

JNIEXPORT jboolean JNICALL Java_com_test_Test_getBoolean(JNIEnv * env,   

  jobject obj, jboolean bool) {   

  

 unsigned char b = bool;   

 printf("\n c-boolean: %lu  ", b);   

 if (b) {   

  printf("true");   

 } else {   

  printf("false");   

 }   

  

 b = 1;   

 return (jboolean) b;   

}   

  

//获取,返回 string   

JNIEXPORT jstring JNICALL Java_com_test_Test_getString(JNIEnv * env,   

  jobject obj, jstring s) {   

 char * st = (char *) (*env)-GetStringUTFChars(env, s, 0);   

 printf("\n c-string:  %s", st);   

  

 char * str = "hello wang wu!";   

 jstring rtn;   

 rtn = (*env)-NewStringUTF(env, str);   

 return rtn;   

}   

  

//获取,返回 string []   

JNIEXPORT jobjectArray JNICALL Java_com_test_Test_getStringArray(JNIEnv * env,   

  jobject obj, jobjectArray arr) {   

 int len = (*env)-GetArrayLength(env, arr);   

 printf("\n c-stringArray :");   

 int i = 0;   

 for (i = 0; i  len; i++) {   

  jobject obj = (*env)-GetObjectArrayElement(env, arr, i);   

  jstring str = (jstring) obj;   

  const char * szStr = (*env)-GetStringUTFChars(env, str, 0);   

  printf(" %d-%s ", i, szStr);   

  (*env)-ReleaseStringChars(env, str, szStr);   

 }   

 //-----返回----   

  

 jstring str;   

 jobjectArray args = 0;   

 jsize size = 5;   

 char* sa[] = { "Hello,", "world!", "zhang", "san", "yuang" };   

 int j = 0;   

 jclass objClass = (*env)-FindClass(env, "java/lang/String");   

 args = (*env)-NewObjectArray(env, size, objClass, 0);   

 for (j = 0; j  size; j++) {   

  str = (*env)-NewStringUTF(env, sa[j]);   

  (*env)-SetObjectArrayElement(env, args, j, str);   

 }   

 return args;   

}   

  

-----------------------------------------------------------------   

  

下面是Test.java   

  

package com.test;   

  

public class Test {   

 private native void sayHello(String str);   

  

 private native int add(int a, int b);   

  

 private native float getFloat(float f);   

  

 private native double getDouble(double d);   

  

 private native boolean getBoolean(boolean b);   

  

 private native String getString(String str);   

  

 private native String[] getStringArray(String[] sa);   

  

 static {   

  System.loadLibrary("Test");   

 }   

  

 public static void main(String[] args) {   

  Test test = new Test();   

  test.sayHello("zhang san");   

  System.out.println("int     -- " + test.add(10, 20));   

  System.out.println("float   -- " + test.getFloat((float) 20.123));   

  System.out.println("double  -- " + test.getDouble(100.369));   

  System.out.println("boolean -- " + test.getBoolean(true));   

  System.out.println("string  -- " + test.getString("wang Wu"));   

  

  String[] ss = { "hello", "-", "zhang", "san" };   

  Object[] obj = test.getStringArray(ss);   

  System.out.print("string[]--  ");   

  for (Object object : obj) {   

   System.out.print(object + " ");   

  }   

  

 }   

  

}

JAVA如何调用C函数

要在java中调用c语言的库,需要使用Java提供了JNI。\x0d\x0a举例说明\x0d\x0a在c语言中定义一个voidsayHello()函数(打印HelloWorld);然后在Java中调用这个函数显示HelloWord.\x0d\x0a现在分别从Java和C语言两部分说明:\x0d\x0a1.Java部分\x0d\x0a首先定义一个HelloNative,在其中申明sayHello函数,函数要申明为Native类型的.如下:\x0d\x0apublicclassHelloNative{\x0d\x0apublicnativevoidsayHello();\x0d\x0a}\x0d\x0a\x0d\x0a编译这个类,生成class文件:\x0d\x0ajavacHelloWorld.java\x0d\x0a\x0d\x0a利用javah生成需要的h文件\x0d\x0ajavahHelloNative\x0d\x0a\x0d\x0a生成的h文件大概如下:\x0d\x0a\x0d\x0a/*DONOTEDITTHISFILE-itismachinegenerated*/\x0d\x0a#include\x0d\x0a/*HeaderforclassHelloNative*/\x0d\x0a\x0d\x0a#ifndef_Included_HelloNative\x0d\x0a#define_Included_HelloNative\x0d\x0a#ifdef__cplusplus\x0d\x0aextern"C"{\x0d\x0a#endif\x0d\x0a/*\x0d\x0a*Class:HelloNative\x0d\x0a*Method:sayHello\x0d\x0a*Signature:()V\x0d\x0a*/\x0d\x0aJNIEXPORTvoidJNICALLJava_HelloNative_sayHello\x0d\x0a(JNIEnv*,jobject);\x0d\x0a\x0d\x0a#ifdef__cplusplus\x0d\x0a}\x0d\x0a#endif\x0d\x0a#endif\x0d\x0a\x0d\x0a可以看一下上面自动生成的程序,程序include了jni.h,这个头文件在$JAVA_HOME下的include文件夹下.还可以发现生成的函数名是在之前的函数名前面加上了Java_HelloNative。\x0d\x0a2.C语言部分\x0d\x0a根据上面生成的h文件编写相应的代码实现,建立一个HelloNative.cpp用来实现显示HelloWorld的函数.如下:\x0d\x0a\x0d\x0a#include\x0d\x0a#include"HelloNative.h"\x0d\x0a\x0d\x0aJNIEXPORTvoidJNICALLJava_HelloNative_sayHello(JNIEnv*,jobject)\x0d\x0a{\x0d\x0aprintf("HelloWorld!\n");\x0d\x0a}\x0d\x0a\x0d\x0a代码编写完成之后,我们再用gcc编译成库文件,命令如下;\x0d\x0agcc-fPIC-I/usr/lib/jvm/java-7-openjdk-i386/include-I/usr/lib/jvm/java-7-openjdk-i386/include/linux-shared-olibHelloNative.soHelloNative.cpp\x0d\x0a\x0d\x0a这样就会在当前目录下生成一个libHelloNative.so的库文件.这时需要的库已经生成,在C语言下的工作已经完成了.\x0d\x0a接下来需要在Java中编写一个程序测试一下.在程序前,需要将我们的库载入进去.载入的方法是调用Java的System.loadLibrary("HelloNative");\x0d\x0a\x0d\x0apublicclassTestNative\x0d\x0a{\x0d\x0astatic{\x0d\x0atry{\x0d\x0aSystem.loadLibrary("HelloNative");\x0d\x0a}\x0d\x0acatch(UnsatisfiedLinkErrore){\x0d\x0aSystem.out.println("Cannotloadhellolibrary:\n"+e.toString());\x0d\x0a}\x0d\x0a}\x0d\x0apublicstaticvoidmain(String[]args){\x0d\x0aHelloNativetest=newHelloNative();\x0d\x0atest.sayHello();\x0d\x0a}\x0d\x0a}\x0d\x0a\x0d\x0a但是再编译后,运行的时候,问题又出现了.\x0d\x0aCannotloadhellolibrary:\x0d\x0ajava.lang.UnsatisfiedLinkError:noHelloNativeinjava.library.path\x0d\x0aExceptioninthread"main"java.lang.UnsatisfiedLinkError:HelloNative.sayHello()V\x0d\x0aatHelloNative.sayHello(NativeMethod)\x0d\x0aatTestNative.main(TestNative.java:13)\x0d\x0a\x0d\x0a载入库失败,但是库明明就是放在当前文件夹下的,怎么会载入失败呢?\x0d\x0a用System.getProperty("java.library.path")查看,发现java.library.path中并不u存在当前的目录.主要有以下的几个解决办法:\x0d\x0a1)将生成的库复制到java.library.path有的路径中去,当然这样不是很好\x0d\x0a2)设置环境变量exportLD_LIBRARY_PATH=.:$LD_LIBRARY_PATH,将当前的目录加入到LD_LIBRARY_PATH中\x0d\x0a3)设置java的选项,将当前的目录加入到其中.java-Djava.library.path=.$LD_LIBRARY_PATH\x0d\x0a这样之后程序就能够成功的运行了.可以看见显示的"HelloWorld!"了

java 通过jni 向 c 传递一个 java 对象, c 如何取得这个对象的属性值?

对于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();

java有什么方法可以清屏?

通过JNI调用一个库文件(.dll),这个dll中包含一个实现清屏功能(system(“cls”))的导出函数。在java程序中加入代码调用这个库,即可实现当前屏幕的清屏。(--JNI的使用,以及dll的制作在百度随便搜索即可找到,这里请恕不多谈^_^--)\x0d\x0a \x0d\x0a实现步骤:\x0d\x0a1.写一个dll.h\x0d\x0a \x0d\x0a#ifndef _Included_Cls \x0d\x0a#define _Included_Cls \x0d\x0a#ifdef __cplusplus \x0d\x0aextern "C"\x0d\x0a{ \x0d\x0a#endif \x0d\x0aJNIEXPORT void JNICALL Java_Cls_clear \x0d\x0a(JNIEnv *, jobject); \x0d\x0a#ifdef __cplusplus \x0d\x0a} \x0d\x0a#endif \x0d\x0a#endif\x0d\x0a2.再写一个dllmain.c\x0d\x0a \x0d\x0a#include "jni.h"\x0d\x0a#include "dll.h" \x0d\x0a#include "stdlib.h" \x0d\x0aJNIEXPORT void JNICALL Java_Cls_clear(JNIEnv *env, jobject obj) \x0d\x0a{ \x0d\x0asystem("cls");\x0d\x0a}\x0d\x0a \x0d\x0a3.用vc++建立一个dll工程(我的工程名为clsTest)\x0d\x0a导入dllmain.c 和dll.h以及jdk下include目录下的jni.h和include/win32下的jni_md.h 共四个文件\x0d\x0a然后build 这个dll工程,将生成的clsTest.dll放入到你的java.library.path中的其中一个目录下\x0d\x0a查看java.libray.path用代码System.out.print(System.setProperty("java.library.path","."));\x0d\x0a我是根据我的配置将clsTest.dll放到C:/Program Files/Java/jdk1.6.0/jre/bin下\x0d\x0a4.测试\x0d\x0a新建一个测试类Test.java\x0d\x0a \x0d\x0apublic class Test{ \x0d\x0apublic native void clear();//左方的native是通知Java这个函数会使用到外部函数 \x0d\x0a \x0d\x0astatic { \x0d\x0aSystem.loadLibrary("clsTest"); //左方的代码代表我要载入clsTest.dll的动态链接\x0d\x0a}\x0d\x0apublic static void main(String[] args) { \x0d\x0afinal Test a=new Test();\x0d\x0aRunnable k=new Runnable(){\x0d\x0a public void run(){\x0d\x0a for(int i=0;i

回答于 2022-12-11

关于jobjectjava和的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。