Tag: jni

如何从jni端调用java方法?

我在jni方面做了一些c代码函数,所有工作都很好。 public native String getMessage() 函数是从jni端返回到java端的字符串,它工作正常,所有其他jni代码也可以正常工作。 但问题是如何在不使用return的情况下返回jni函数中的字符串,所以 public native void getMessagewithoutReturn() 应该能够返回字符串。 然后我,但getMessagewithoutReturn()函数永远不会使用pthread结束循环,如下所示,你可以看到:(它有效) pthread_t native_thread; pthread_create(&native_thread, NULL, native_thread_start_reading, env); 并且每个循环迭代时间我都必须能够返回字符串,所以我不能使用return,因为它会停止函数运行。 pthread_t native_thread; pthread_create(&native_thread, NULL, native_thread_start_reading, env);sted out that 我已经测试了那个posix线程,并且在android方面一切正常,因为它一直不是启动工作线程,但现在只是在每个迭代时间获取字符串的问题,而不使用函数返回。

使用SWIG处理C函数返回Java中结构数组的指针

我想弄清楚需要什么SWIG接口文件更改才能处理getFoo返回一个指向自定义结构数组的指针(sender_id_t)。 没有任何特殊的SWIG接口代码,我只得到Java端的指针。 如何将该指针转换为可循环或迭代的东西(在Java中),以便我可以获取每个sender_id_t id值? 感谢任何建议。 C结构: typedef unsigned char id_v1_t[32]; typedef id_v1_t id_t; %rename (Sample) sender_id_t_; struct sender_id_t_ { id_t id; uint32_t phy_idx; }; Cfunction: //This will return a pointer to an array of sender_id_t data. The number of elements is retrieved from a separate call. sender_id_t* getFoo(resultset_t* resultset); 例外: [exec] test_wrap.c: In function `new_foo_array’: […]

JNI – 如何使用具有不同字段的多个Jni包装器实例?

背景 我有一个使用JNI(使用NDK)在Java和C / C ++中编码的android项目。 我已经在java端创建了一个Jni java包装器,它将自己完成所有Jni操作,而没有其他java类可以直接访问除此包装器之外的jni操作。 问题 问题是,我希望创建这个包装器的多个实例,而Jni部分应该有一个每个Jni包装器的实例。 这是一个问题,因为Jni部分为所有实例保存相同的字段。 这个问题 我怎样才能解决这个问题,这样对于jni包装器的每个java实例,jni部分都会有一个实例? 我在想,也许我可以将所有字段放入C ++类,并且有一个init()函数,它将为JniWrapper的CTOR返回它的新实例,从那时起,对于需要字段的每个JNI函数,它会将此类作为参数。 也许它可能是这个链接上显示的指针。 可悲的是,我不知道该怎么做。 有人可以帮忙吗? 样品 这是一个示例代码,我希望这些代码能让那些不了解问题的人更清楚: java部分: public class JniWrapper { static { System.loadLibrary(“JniTest”); } private native void foo(Bitmap bitmap); } jni部分: … // sadly, all of those fields are actually a global fields int _intField; float _floatField; //those are just sample […]

在java中运行fortran exe

尊敬的先生/女士, 我有一个fortran exe,它接受一个输入文件并通过对输入文件进行一些操作来生成输出文件。我能够在linux终端中运行命令。(我认为fortran编译器可以在linux中使用)。现在请建议如何运行这个fortran可执行文件使用java(在Linux机器上)。 我的尝试是, String cmd=”fortranExe arg1 arg2″; //fortranExe=exe path //arg1,arg2 are arguments to fortran executable program Process p=Runtime.getRuntime().exec(cmd); 但我没有得到输出。当我尝试运行Linux命令如ls时,dir正在提供输出。在java中运行fortran代码需要什么?

java.lang.UnsatisfiedLinkError – JNI

每次运行程序时,我都会收到java.lang.UnsatisfiedLinkError错误。 我有一个本机,一个包装器,以及通过包装器调用本机的程序。 main.h #ifndef __MAIN_H__ #define __MAIN_H__ #include #ifdef BUILD_DLL #define DLL_EXPORT __declspec(dllexport) #else #define DLL_EXPORT __declspec(dllimport) #endif #include #include using namespace std; extern “C” { JNIEXPORT void JNICALL native_MessageBox(string text, string title); } #endif main.cpp中 #include “main.h” #include #include using namespace std; JNIEXPORT void JNICALL MsgBox(string text, string title) { MessageBox(NULL, text.c_str(), title.c_str(), MB_OK); […]

对于程序的一个实例,“发生了JNI错误”,而不是另一个实例

我在一台运行良好的计算机上的Eclipse Java Mars中创建了一个大型程序。 我将程序导出为可运行的Jar文件并运行它没有任何问题。 即使我将整个项目导出到另一台计算机,该程序仍然有效。 当我对项目进行细微更改时,问题出现在另一台计算机上。 这些更改只是基于内容的更改,并且应该对程序的function没有任何影响。 从eclipse运行程序似乎没有问题。 但是,当我想运行新创建的Jar文件时,我收到以下错误: Error: A JNI error has occurred, please check your installation and try again. 然后是框架说: A Java Exception has occurred. 所以我的问题是: 如何通过Jar文件不能运行同一程序的不同实例,而旧实例可以? 我在两台计算机上使用相同的JDK版本(1.8.0_73),并以几乎相同的方式安装它们:我首先通过组合版本将NetBeans与NetBeans一起安装。 接下来,我安装了Eclipse。 唯一的区别是在新计算机上我安装了eclipse离线,即没有Eclipse安装程序

使用-h选项时,javac“没有源文件”

我正在尝试使用JNI和JDK 9.我有一个类NativeTest.java ,如下所示: public class NativeTest { static { System.loadLibrary(“hello”); } private native void sayHello(); public static void main(String[] args) { new NativeTest().sayHello(); } } 我编译该类,然后使用javah NativeTest生成头文件。 发出javah ,我收到此警告: Warning: The javah tool is planned to be removed in the next major JDK release. The tool has been superseded by the ‘-h’ option added to […]

如何在Mac OS X中使用带有Java的Windows DLL?

我已经看到一些Java项目使用taucs.dll , TAUCS -a稀疏线性求解器的C库,通过Windows中的JNI。 我想我可以通过将TAUCS编译成类似libTaucs.jnilib东西在Mac OS X中实现相同的libTaucs.jnilib 。 我可以访问库的代码,但不知道如何将其编译成DLL,更不用说JNI库了。 到目前为止,我只能编译为静态库。 有没有办法将DLL转换为Mac的JNI库? 如果我必须编译代码,该怎么做? 在动态库中包装静态库是否可以与JNI一起使用,特别是对于TAUCS,如果有人有经验的话?

JNI。 如何从jobject获取jstring并将其转换为char *

这就是我到目前为止:我传递一个有2个字段的对象:String和Integer,作为参数,我想发送信息来处理它在C部分,这在这一点上并不重要…我得到抱怨在jstring声明 JNIEXPORT jint JNICALL Java_Tier3_NativeMethods_totalPalletsIn( JNIEnv *env, jclass cls, jobject stat) { jclass staticsitcs = (*env)->GetObjectClass(env, stat); // Here I try to get it using the ID jfieldID idDate = (*env)->GetFieldID(env, staticsitcs, “date”, “S”); jstring dateString = (jstring)(*env)->GetStringRegion(env, stat, idDate); // Here converting whatever I get in jstring to char* char* date = (*env)->GetStringUTFChars(env,dateString,0); // […]

JNI system.out和printf行为

我正在编写一个程序,它使用JNI与简单的c程序进行交互。 我创建了以下程序: public static void main(String[] args) { Hello h = new Hello(); System.out.println(“before”); int number = h.sayHello(); System.out.println(number); System.out.println(“after”); } 和 JNIEXPORT int JNICALL Java_Hello_sayHello (JNIEnv *env, jobject obj) { printf(“Hello JNI\n”); return 10; } 令我惊讶的是这个程序返回: before 10 after Hello JNI 对我来说这很奇怪,因为很明显c程序是在“before”和“after”语句之间执行的(打印数字10)。 但是为什么printf语句在调用时不会被执行。 它是否以某种方式被jvm阻止,因为只允许一个程序同时写入输出? 有没有办法纠正这种行为?