Tag: jni

C / C ++ Reflection和JNI – 一种调用尚未编写的本机代码的方法

我正在实现一个Java软件,希望允许C库作为插件。 为了调用这些未来的函数,我需要以某种方式在Java中创建一个本机函数,我可以从中调用尚不存在的代码。 方法签名将是静态的,但方法和类名称可能会更改。 有没有办法检查加载的库或可用的function? 我希望它的工作方式如下: 在我的Java类中,我会有一个函数; public static native void thirdParty(String class, String method, int[] data, int[] params); 哪个会在我的C库中调用一个函数; JNIEXPORT void JNICALL Java_com_ex_app_Native_thirdParty(JNIEnv *, jclass, jstring, jstring, jintArray, jintArray); 我可以从中获取类和方法名称,如果它们存在则调用它们,如果它们不存在则抛出exception。 我想我正在寻找的是某种Java风格的reflection,但是在C语言中或者在C ++中失败了。 我怎样才能做到这一点?

关于clsStr变量的全局是什么,“clsStr =(* env) – > NewGlobalRef(env,cls)”?

JNI中的全局引用被认为是必须由程序员手动释放的引用。 它与c上下文无关。 所以像这样的代码: { jclass clsStr = (*env)->NewGlobalRef(env,cls); } return clsStr; 会给出一个错误,说clsStr是未定义/未声明的 。 我理解这一点。 但我不明白的是使用这些类型的参考。 在上面的代码中clsStr全局是什么? 此变量在将来或在调用返回后如何有用? 我还读到“基本上,全局引用对于确保它(及其内容)将存活到下一个JNI调用是有用的”但我不明白这一点。

有没有什么方法可以释放生成的java代码中的内存来通过JNI / JNA绑定C代码?

我正在使用一个使用JNA绑定到原始C库的Java库(该库名为Leptonica)。 我遇到了一种情况,必须在C代码中调用free(data)来释放内存。 但是,java中是否有任何可以释放内存的function? 在C代码中 void ImageData::SetPixInternal(Pix* pix, GenericVector* image_data) { l_uint8* data; size_t size; pixWriteMem(&data, &size, pix, IFF_PNG); pixDestroy(&pix); image_data->init_to_size(size, 0); memcpy(&(*image_data)[0], data, size); free(data); } 函数pixWriteMem()将为“数据”创建和分配内存,您需要自由(数据)以便以后释放内存。 在Java代码中,我只能访问pixWriteMem(),而不能访问SetPixInternal(),所以我无法释放“数据”,这会造成内存泄漏。

参数传递本机方法

可能重复: jni将jstring转换为char * С上有一个函数(traverser.c模块) long int Traverser(const char * sTraversingRoot) { long int nCount; struct stat rStatBuf; time_t nTime; char sActualPath[512]; PGconn *pConn; // Open DB connection sprintf(sConnInfo, “hostaddr=%s port=%s connect_timeout=50 dbname=%s user=%s password=%s”, sIP, sPort, sDBName, sLogin, sPassword); pConn = PQconnectdb(sConnInfo); if (PQstatus(pConn) == CONNECTION_BAD) { AddErrorToLog(“No connect\n”); return 0; } GetActualPath(sActualPath, sTraversingRoot); if […]

Android NDK wifi示例

我想在android中使用NDK在c代码的帮助下使用WIFI的function。 我不想将Java API用于WIFI。 我试过谷歌以及stackoverflow,但我没有任何例子。 我只是想知道,让我知道是否有可能? 我找到了一些用于WIFI的 Android API。 但我对实施没有任何了解。

Cygwin编译错误有问题的框架:#C 使用JNI

我使用JNI创建了一个简单的hello world应用程序一切正常,即使我的64位的dll被创建但是当我运行应用程序时它显示以下错误: # # A fatal error has been detected by the Java Runtime Environment: # # EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x0000000180116d47, pid=2140, tid=0x0000000000001710 # # JRE version: Java(TM) SE Runtime Environment (8.0_131-b11) (build 1.8.0_131-b11) # Java VM: Java HotSpot(TM) 64-Bit Server VM (25.131-b11 mixed mode windows-amd64 compressed oops) # Problematic frame: # C [cygwin1.dll+0xd6d47] # […]

将char数组从java返回到C – JNI

我有一个Java对象存储库。 我的C程序在java中存储数据(以char数组的forms)。 现在我希望从我的商店中检索数据。 我找不到任何返回char数组的函数调用。 我怎样才能做到这一点?

不满意的链接错误:java.library.path中没有库文件

我有这样的目录结构 . –compile_c.sh –compile_java.sh –config.sh –execute_java.sh –run.sh –src –ccode –jnitest_SimpleJNITest.h –rtm_simple.c –jnitest –SimpleJNITest.java –lib –rtm_simple.so –classes –SimpleJNITest.class 当它具有在rtm_simple.c充实的native方法时,如何正确运行rtm_simple.c ? 目前,我已定义 config.sh targetDir=”classes” libDir=”lib” srcDir=”src” MainPackage=”jnitest” Main=”SimpleJNITest” ccodeDir=”ccode” cFileName=”rtm_simple” jdkDir=”/home/user/local/java/jdk1.7.0_65″ mkdir -p “$targetDir” mkdir -p “$libDir” 我正试图跑 run.sh #!/bin/bash source compile_java.sh javah -d “${srcDir}/${ccodeDir}” -cp “$targetDir” -jni “${MainPackage}.${Main}” source compile_c.sh source execute_java.sh 哪里 compile_java.sh #!/bin/bash source […]

有效地通过JNI传递大C结构

我有一个大的C结构(大约40个成员,int和char []),我必须通过JNI到Java端进行进一步处理。 这反复发生。 (我已经把GetMethodID()等放到了C端的init()函数中,所以我只需要调用它们一次。) 什么是有效的方法呢? 我能想到: 通过GetMethodID( …, “”, … )使用适当的成员实例化Java类,并通过构造函数传递C结构的所有成员; 使用适当的成员分配Java结构,并通过SetXYZField()初始化(公共)成员; … 我忽视了什么吗? (这是我与JNI的第一次“近战”。)是否真的没有有效的方法来“同步”C结构和Java结构? 什么是更有效的传递方法,1。或2.? 如果是1.,我应该通过CallXYZMethod() (参数列表)还是CallXYZMethodA() (参数数组)传递构造函数参数? 感谢您的输入。 编辑:稍微重写; 2.当然不需要是一个类,如果有一些其他解决方案来处理Java端的C数据,我并不需要Java方面的结构。 编辑2:我在C ++中这样做,但结构本身源于C-linkage回调函数,即没有C ++特定的问题。 改为阅读“C”而不是“C ++”。

在jni中运行的本机C代码与在Android中的shell中运行之间存在差异

我有一个原生的C Android应用程序。 首先,我将本机C代码构建到共享库中,jni将使用此库。 这个库使用一些内核可加载模块.ko,一些已经加载,一些必须通过“insmod”命令加载。 我还构建了一个使用该库的可执行文件,它通过命令行运行。 但是当它调用需要加载内核模块的函数时,执行与可执行文件相同工作的jni会失败。 那么他们之间有什么区别? 我是否需要授予我的应用程序一些权限?