Tag: jni

内存泄漏使用JNI从Java代码中检索String的值

我正在使用GetStringUTFChars使用JNI从java代码中检索字符串的值,并使用ReleaseStringUTFChars释放字符串。 当代码在JRE 1.4上运行时,没有内存泄漏,但如果使用JRE 1.5或更高版本运行相同的代码,则内存会增加。 这是代码的一部分 msg_id=(*env)->GetStringUTFChars(env, msgid,NULL); opcdata_set_str(opc_msg_id, OPCDATA_MSGID, msg_id); (*env)->ReleaseStringUTFChars(env, msgid,msg_id); 我无法理解泄漏的原因。有人帮忙吗? 这个是因为如果我评论其余代码但是留下这部分内存泄漏发生。 这是我正在使用的代码的一部分 JNIEXPORT jobjectArray JNICALL Java_msiAPI_msiAPI_msgtoescalate( JNIEnv *env, jobject job, jstring msgid, jlong msgseverity, jstring msgprefixtext, jint flag ) { opcdata opc_msg_id; /* data struct to store a mesg ID */ const char *msg_id; int ret, ret2; jint val; val=67; jstring str=NULL; […]

Android如何通过JNi示例使用libjpeg-turbo库

我用ndk-build成功构建了libjpeg-turbo,感谢这篇文章: libjpeg-turbo for android 我想在libjpeg-turbo的example.c中获得像read_JPEG_file这样的本机函数来从Java代码调用它以用于Android应用程序。 有人能给我一个例子怎么做吗? 如何编写使用libjpeg-turbo ndk构建库的Java本机方法? 我可以通过加载库 System.loadLibrary(“libjpeg”); 但接下来呢? 该库没有任何本机方法可以从Java调用。 我试图根据JNI文档编写一个JNI c类但没有成功。 示例代码非常适合学习如何操作。 编辑: 我创建了一个测试类NativeMethods: package com.test.app; public class NativeMethods { private String filename = null; static { System.loadLibrary(“jpeg”); // this represents compiled libjpeg-turbo under ndk } public NativeMethods(String jpegFilename) { this.filename = jpegFilename; } public native int computeNumberOfDCTS(String filename); } 然后我使用javah生成本机方法的C头,结果是com_test_app_NativeMethods.h文件包含: /* […]

将ExceptionDescribe转换为字符串

我需要在JNI中将ExceptionDescribe()的输出作为字符串获取,这样我就可以在文件中将其写入,而不是直接在命令行上编写它。 有什么办法或想法怎么做? 提前致谢, 萨米

Jni FindClass返回NULL

我在头文件中得到了c ++结构, struct StatusLine { static jclass Class; // Lorg/apache/http/StatusLine; static jmethodID GetStatusCode; // ()I }; struct ByteArrayOutputStream { static jclass Class; // Ljava/io/ByteArrayOutputStream; static jmethodID Constructor; // ()V static jmethodID Close; // ()V static jmethodID ToByteArray; // ()[B }; struct HttpEntity { static jclass Class; // Lorg/apache/http/HttpEntity; static jmethodID WriteTo; // (Ljava/io/OutputStream;)V static jmethodID […]

无法在Java / C ++中为外部应用程序设置always-on-top

我正在寻找解决方案,使外部应用程序(不是像记事本或calc.exe这样的Windows应用程序)在Java GUI中按下按钮后始终保持在顶部。 我在C ++中使用此代码来获取桌面上所有打开的窗口并将其进程ID(PID)与已发送的PID(来自我在Java中的应用程序)相匹配: #include “cjni.h” #include #include #include using namespace std; BOOL CALLBACK EnumWindowsProc(HWND windowHandle, LPARAM lParam){ DWORD searchedProcessId = (DWORD)lParam; DWORD windowProcessId = 0; GetWindowThreadProcessId(windowHandle, &windowProcessId); printf(“process id=%d\n”, windowProcessId); if(searchedProcessId == windowProcessId) { HWND hwnd = windowHandle; SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE); printf(“Process ID found !”); return FALSE; } return TRUE; […]

JNI“env-> GetStaticMethodID()”崩溃的程序

我正在尝试从C ++调用Java函数。 到目前为止这是我的代码: #include typedef struct JavaVMCreationResult { JavaVM* jvm; JNIEnv* env; } JVMCreationResult; JVMCreationResult* CreateJavaVM() { JavaVM* jvm; JNIEnv* env; JavaVMInitArgs args; JavaVMOption opts[1]; opts[0].optionString = “-Djava.class.path=C:\\MyJavaClasses”; args.version = JNI_VERSION_1_6; args.nOptions = 1; args.options = opts; args.ignoreUnrecognized = JNI_TRUE; JNI_GetDefaultJavaVMInitArgs(&args); JNI_CreateJavaVM(&jvm, (void **) &env, &args); JavaVMCreationResult* cres; cres->jvm = jvm; cres->env = env; return […]

应用程序中的Android JNI DETECTED ERROR:JNI GetMethodID被调用挂起exception

我正在尝试用我的android项目运行Googles OCR Tesseract。 我已经用android-ndk编写了tesseract,并在我尝试运行android项目后收到此错误。 我的环境如下 Android 5.1.1 android-ndk-r10e for windows Android的SDK-R22 作为参考,我是根据此处列出的示例链接示例构建的 提前致谢! 这是我的logcat结果的片段: I/DEBUG ( 182): Revision: ‘0’ I/DEBUG ( 182): ABI: ‘arm’ I/DEBUG ( 182): pid: 20291, tid: 20337, name: JavaBridge >>> com.enterprisem obility.OCR <<< I/DEBUG ( 182): signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr ——– I/DEBUG ( 182): Abort message: 'art/runtime/check_jni.cc:65] […]

从robovm项目创建iOS静态库(JNI中的BAD_ACCESS)

我有大量的Java代码(只有计算函数,没有UI),我想在iOS中作为静态库重用。 我的方法是使用robovm并按照非官方的方式创建一个静态库,在robovm论坛的两篇文章中描述: 1基本方式和2精炼版本 尝试按照描述完全按照步骤操作,在使用脚本创建共享库,在Xcode中链接库(.a)并成功构建项目之后,我不幸遇到了问题。 在运行期间,我看到我的C ++桥代码被调用,但JNI回调到库失败并带有BAD_ACCESS。 例如,以下行崩溃: jclass myJavaClass = jniEnv->FindClass(“com/test/robovm/bridge/MyJavaRoboCode”); 在这个方法中: void callSomethingInJava(const char* arg) { // To call into java from your native app, use JNI Env* rvmEnv = rvmGetEnv(); JNIEnv* jniEnv = &(rvmEnv->jni); jclass myJavaClass = jniEnv->FindClass(“com/test/robovm/bridge/MyJavaRoboCode”); jmethodID myJavaMethod = jniEnv->GetStaticMethodID(myJavaClass, “callJava”, “(Ljava/lang/String;)V”); jstring argAsJavaString = jniEnv->NewStringUTF(arg); jniEnv->CallStaticVoidMethod(myJavaClass, myJavaMethod, argAsJavaString); } 如果我尝试直接使用rvmXX方法而不是JNI并尝试访问“Java”类中的某些内容,情况也是如此。 […]

使用C中的JNI从对象获取对象

public class Student { private People people; private Result result; private int amount; } 以下是Java中类的示例; 在C中,我试图让“学生”中的“人”,但我失败了。 但是,我可以从“学生”获得int类型“金额”。 jobject getObjectFromObject(JNIEnv *env, jobject obj, const char * fieldName) { jfieldID fid; /* store the field ID */ jobject i; /* Get a reference to obj’s class */ jclass cls = (*env)->GetObjectClass(env, obj); /* Look for the instance […]

Javagenerics和JNI

是否可以使用带有generics参数的JNI调用本机CPP函数? 类似于以下内容: public static native T foo(U u, V v); 然后称之为: //class Foo, class Bar, class Baz are already defined; Foo f = foo(new Bar(), new Baz()); 任何人都可以请我提供一个实际上正在做这个或网上教程的样本吗? 我问,因为在我的CPP JNI函数(由JVM调用)中,我得到了不满意的链接错误。 CPP代码如下: JNIEXPORT jobject JNICALL Java_Processor_process (JNIEnv *env, jclass processor_class, jobject obj1, jobject obj2) { jclass bar_class = env->FindClass(“Bar”); jmethodID getFooMethod = env->GetMethodID(bar_class, “getFoo”, “()Ljava/lang/Object;”); //getFoo() […]