Tag: jni

JNI在C和C ++中调用不同的东西?

所以我在C中使用以下代码利用Java Native Interface但是我想将其转换为C ++,但我不确定如何。 #include #include #include “InstanceMethodCall.h” JNIEXPORT void JNICALL Java_InstanceMethodCall_nativeMethod(JNIEnv *env, jobject obj) { jclass cls = (*env)->GetObjectClass(env, obj); jmethodID mid = (*env)->GetMethodID(env, cls, “callback”, “()V”); if (mid == NULL) { return; /* method not found */ } printf(“In C\n”); (*env)->CallVoidMethod(env, obj, mid); } Java程序: class InstanceMethodCall { private native void nativeMethod(); private […]

将字符串从Java传递到JNI

我想将一个字符串传递给我正在写的JNI,它必须分配给一个const char *。 以下提到我是如何做到的: JNI…(…,jstring jstr…){ const char* str = env->GetStringUTFChars(jstr,0); env->ReleaseStringUTFChars(str,jstr,0); } 但是如果我在分配给jstring后打印const char * str,那么与我直接在JNI和printf中分配str值相比,我看到的是不同的。 这是正确的方法吗? 或者是否还有其他方法可以将字符串从java分配给JNI中的const char *?

使用JNI从C调用Java代码时内存泄漏

我有一个C程序,使用JNI在Java商店中存储一些对象。 (在有人问之前,使用java商店是一个需求,我必须在C中编写一个能够从该商店添加和检索对象的客户端)。 我制作了程序并尝试添加100000大小为1KB的对象。 但是在添加了50000个对象后,我得到了“内存不足”的消息(请注意,每当我无法使用NewStringUTF和NewByteArray函数分配新的字符串或字节数组时,我就会打印这些“内存不足”消息)。 那时我的应用程序只使用80MB的内存。 我不知道为什么这些方法返回NULL。 有什么我想念的东西。 此外,即使我正在发布为java创建的字节数组和字符串,内存也在不断增加。 这是源代码。 void create_jvm(void) { JavaVMInitArgs vm_args; JavaVMOption vm_options; vm_options.optionString = “-Djava.class.path=c:\\Store”; vm_args.version = JNI_VERSION_1_4; vm_args.nOptions = 1; vm_args.options = &vm_options; vm_args.ignoreUnrecognized = 0; JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args); if(env != null) { j_store = (*env)->FindClass(env, “com/store”); if(j_store == null) { printf(“unable to find class. class name: JStore”); } } […]

发生JNI错误,请检查您的安装并在Eclipse x86 Windows 8.1中重试

public class LoginCumReg implements ActionListener,KeyListener { private JFrame form; private JTextField txtunm; private JTextField txtnm; private JTextField txteml; private JButton cmdcreate; private JPasswordField txtpass; private JPasswordField txtpassreg; private JButton cmdok; private JLabel lblunm; private JLabel lblpass; private JLabel lbleml; private JLabel lblpassreg; private JLabel lblnm; private JPanel panel_1; public LoginCumReg() { // construct components form […]

jni.h:没有这样的文件或目录

我在Windows中使用Code :: Blocks。 我创建了一个dll项目试图获得一些JNI练习。 在javah生成的.h文件中,有#include jni.h,但是当我尝试编译它时,它一直在说jni.h:没有这样的文件或目录。 我认为它与classpath有关,但我不知道它是什么! 它可能设置我必须在Code :: Blocks中更改 有人可以帮我解决一下吗? 非常感谢 /* DO NOT EDIT THIS FILE – it is machine generated */ #include /* Header for class Vector3D */ #ifndef _Included_Vector3D #define _Included_Vector3D #ifdef __cplusplus extern “C” { #endif /* * Class: Vector3D * Method: magnitude * Signature: ()D */ JNIEXPORT jdouble JNICALL […]

是否可以使用sun.misc.Unsafe在没有JNI的情况下调用C函数?

一段C / C ++代码可以为JNI方法提供一个函数指针数组。 但是有没有办法直接从Java代码内部(不使用JNI或类似代码)调用数组指针指向的函数? JNI以某种方式做了类似的事情,所以必须有办法。 JNI是如何做到的? 是通过sun.misc.Unsafe吗? 即使不是,我们是否可以使用一些不安全的解决方法来获取执行该操作的JVM代码? 我当然不打算在商业上使用它。 我甚至不是专业人士,我只是非常喜欢编码而且我最近一直在研究CUDA,所以我想也许我可以尝试将所有东西混合在一起,但JNI调用的开销会破坏GPU加速代码的目的。

在JNI中,如何根据IBM的性能建议缓存类,methodID和fieldID?

我在IBM上读到了这一点 要访问Java对象的字段并调用它们的方法,本机代码必须调用FindClass(),GetFieldID(),GetMethodId()和GetStaticMethodID()。 对于GetFieldID(),GetMethodID()和GetStaticMethodID(),为给定类返回的ID在JVM进程的生命周期内不会更改。 但是获取字段或方法的调用可能需要在JVM中进行大量工作,因为字段和方法可能是从超类inheritance的,这使得JVM在类层次结构中向上移动以找到它们。 因为给定类的ID是相同的,所以您应该查找它们一次然后重复使用它们。 同样,查找类对象可能很昂贵,因此它们也应该被缓存。 如何在JNI中缓存 methodID , fieldID和class对象? 是否有必须遵循的内置方法或特定程序?

当使用va_arg传递char *时,将char *转换为JNI中的jstring

是否有必要将char *转换为jbyteArray,然后调用java String的构造函数来生成jstring? 怎么办呢? 请帮忙。 static int testhandler(void *arg, …) { int i; struct callback *cb = (struct callback *)arg; JNIEnv *env = cb->env; char *sig = cb->signature; jint size = (jint) strlen(sig); jint size1; va_list arguments; jobjectArray return_array; jclass obj_class; jbyteArray bytes; jstring str; obj_class = (*env)->FindClass(env, “java/lang/Object”); return_array = (*env)->NewObjectArray(env, size, obj_class, NULL); […]

来自JNI_CreateJavaVM(jvm.dll)的exception0xC0000005

我正在使用以下C ++代码初始化Java VM。 JNI_CreateJavaVM会抛出一个0xC0000005exception,但如果我忽略它就会成功。 ‘Jni.exe’(Win32):加载’C:\ Tools \ Java \ Jdk8.77×86 \ jre \ bin \ zip.dll’。 无法找到或打开PDB文件。 Jni.exe中0x02900282处抛出exception:0xC0000005:访问冲突读取位置0x00000000。 ‘Jni.exe’(Win32):加载’C:\ Windows \ SysWOW64 \ shell32.dll’。 无法找到或打开PDB文件。 我忘了设置或做某事还是这种“正常”行为? #include #include “jni.h” int main( int argc, char const* args[]) { JavaVM* jvm; JNIEnv* env; std::array options; options[0].optionString = “-Djava.class.path=C:/Users/Thomas/Documents/Visual Studio 2015/Projects/Jni/x64/Debug”; options[0].extraInfo = nullptr; JavaVMInitArgs vm_args; vm_args.version = […]

在Java和C之间传递数据

我有一个C结构。 struct data{ double value1[50]; double value2[50]; int count; }; 我想将数据从java映射到这个C结构。如何使用JNI? java代码不会由我编程。 java程序员只想知道他应该以哪种forms向我发送数据? 他是否应该期待更多细节 我目前正在通过使用包含2列的CSV文件填充结构实例来测试我的代码。 我还想从我的C代码返回3个double值到java应用程序。