Tag: jni

JNI从c程序调用java方法

我需要从c程序中调用java方法。 我尝试过以下代码,通过Java本机接口调用java方法,但在编译时遇到问题。 我是C新手,有java经验。 所以,我无法想象自己在创建JVM时发生了什么。 以下是代码。 CTest.c #include #include JNIEnv* create_vm() { JavaVM* jvm; JNIEnv* env; JavaVMInitArgs args; JavaVMOption options[1]; args.version = JNI_VERSION_1_6; args.nOptions = 1; options[0].optionString = “-Djava.class.path=D:\\Ashish_Review\\JNI\\src”; args.options = options; args.ignoreUnrecognized = JNI_FALSE; JNI_CreateJavaVM(&jvm, (void **)&env, &args); return env; } void invoke_class(JNIEnv* env) { jclass helloWorldClass; jmethodID mainMethod; jobjectArray applicationArgs; jstring applicationArg0; helloWorldClass = […]

JNI:无法获得数组长度

我遇到了下一个问题:在C代码中我无法对byte[] (jbyteArray)做任何事情。 在JNI中使用数组的所有函数都会导致JNI DETECTED ERROR IN APPLICATION: jarray argument has non-array type 。 我的代码出了什么问题? C: #include #include static jstring convertToHex(JNIEnv* env, jbyteArray array) { int len = (*env)->GetArrayLength(env, array);// cause an error; return NULL; } static JNINativeMethod methods[] = { {“convertToHex”, “([B)Ljava/lang/String;”, (void*) convertToHex }, }; JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved) { JNIEnv* env […]

将图像数据从Java传递到C本机函数接受指针

我在外部.so文件中提供了一个C函数。 此function将图像数据作为输入,并提供压缩图像以及图像的长度作为输出。 function模板如下: char * OutputImage = CompressImage((char *)InputImage,(int)&lenOutImage); 在我的Java代码中,我将输入图像捕获为byte []数据类型。 现在我需要将它传递给上面提到的本机C函数。 能帮助我如何从Java实现这一目标吗?

从C语言调用Java函数

我想从c代码调用java函数。 我在http://www.ishaanguliani.com/content/calling-java-functions-c-linux-ubuntu-jni的示例中讨论过JNI 。 我使用相同的代码并遵循相同的步骤,但我无法找到类打印。 我调试但我没找到我做错了什么。 在这里分享我的代码 unions@universe:~/uni_tmp/jni/vvn$ cat MyC.c #include #include #include “MyJava.h” #include JNIEnv* create_vm(JavaVM ** jvm) { JNIEnv *env; JavaVMInitArgs vm_args; JavaVMOption options; options.optionString = “-Djava.class.path=./”; //Path to the java source code vm_args.version = JNI_VERSION_1_6; //JDK version. This indicates version 1.6 vm_args.nOptions = 1; vm_args.options = &options; vm_args.ignoreUnrecognized = 0; int ret = […]

JAVA JNI C调试器

是否有任何调试器可以帮助调试Java JNI程序和C库? 我应该能够从Java中的static void main开始调试程序,并继续调试并在本机c函数中放置断点,然后在控制从C传输到Java之后继续在Java中调试。

通过JNI / DLL或EXE执行本机代码?

我们有一个本机应用程序,我们可以通过JNI-> DLL或通过命令行参数调用EXE来访问。 哪种方法最好? 我们将每天调用此方法大约100次。 表现并不是非常重要。 这个原生应用程序是由我们公司以外的团队开发的,所以我们不太熟悉代码(尽管我们拥有它)。 EXE路线似乎更容易,更直接(特别是因为我们没有使用很多C)。 另外,如果你的DLL代码有内存泄漏或遇到其他一些麻烦,我会收集JNI,你可以崩溃你的JVM。

JNI – C ++ / Java中的监听器 – 可以用c ++实例化Java对象并将它们用作参数

以下是否适用于JNI? public NativeClass { static { System.loadLibrary(“dll”); } public static native void addListener(Listener listener); } public interface Listener { public void eventOccurred(Info info); } public Info { private final String s1; private final String s2; public Info(String s1, String s2); // … getters for use in Java } 是否有可能 在dll上注册一个Listener对象(据我所知,应该没问题) 在c / c ++代码中实例化一个Info对象,并将其用作调用Listener.eventOccured(Info…)的参数? 或者什么是实现从DLL获取一些信息的侦听器的好方法? […]

使用Swig的JNI for C和函数指针回调的麻烦

我们在java中加载的一个库中有一个C函数,它接受一个函数指针 function定义如下 typedef char int8 typedef unsigned short uint16 uint32 poll_broadcasts(void *(pfn)(int8*,uint16)); 在C中,它如下使用 void handle_broadcasts( int8 *broadcast, uint16 length ) uint32 a = poll_broadcasts( (void*(*)(int8*,uint16)) handle_broadcasts ) 但是当您使用Swig生成JNI包装器时,它会为poll_broadcast创建以下定义 public static long poll_broadcasts(SWIGTYPE_p_f_p_char_unsigned_short__p_void pfn) { return TestJNI.poll_broadcasts(SWIGTYPE_p_f_p_char_unsigned_short__p_void.getCPtr(pfn)); } 按照答案 我应该如何编写.i文件来包装Java或C#中的回调 试过下面 test.h void * data; typedef void* (*callback_handle_broadcast_t)(int8*, uint16); static callback_handle_broadcast_t handle_broadcast; static void set_handle_broadcast(callback_handle_broadcast_t cb, […]

jni – 将int 转换为jobjectArray并将其返回给java

我想在c中创建一个新数组,保持原始数组加倍。 这是我的c代码,它编译但应用程序崩溃: #include JNIEXPORT jobjectArray JNICALL Java_com_example_jninew_MainActivity_getNum(JNIEnv *env, jobject obj, jintArray arr) { int i,j, sum = 0; jsize width = (*env)->GetArrayLength(env, arr); int array[2][2]; for (i=0; iGetObjectArrayElement(env, arr, i); int height = (*env)->GetArrayLength(env, line); jint *pos = (*env)->GetIntArrayElements(env, line, 0); for (j=0; jReleaseIntArrayElements(env, arr, pos, 0); } return array; } 主要java代码: package com.example.jninew; import […]

在JNI函数(Android)之外从C调用java中的函数?

我正在尝试使用Android中的JNI从我的C代码调用Java函数,但我处于一种有点尴尬的境地。 我的C代码在传递给库的回调中的JNI函数之外执行。 这是java代码的一个例子 package com.my.java.package; class MyClass { public function handleData(byte[] data) { doSomethingWithThisData(data); } } 这是C代码的一个例子 void handleData(uint8_t *data, size_t len) { // I need to call handleData in my java // class instance from here, but i have // no access to a JNIEnv here. // I don’t think I can create one, […]