标签: java-native-interface

获取嵌套类方法的 JNI 签名

假设我有一个名为 Scope 的类,它有一个名为 Variable 的嵌套类,我到底如何使用它javap -s来获取内部类的 JNI 签名?我试过做

javap -classpath <classpath> -s Scope$Variable

,但这似乎不起作用。它似乎只是给我提供了相同的信息,就像我只输入“Scope”而不是“Scope$Variable”一样。

谢谢你的帮助

java java-native-interface command-line

1
推荐指数
1
解决办法
3453
查看次数

-Djava.library.path 在 UNIX JVM 上工作吗?

我有一个 Java 应用程序,它依赖于一些用 C 编写的遗留代码,并通过 JNI 访问这些代码。本机库存储在一个子目录中(实际上,有两个子目录:一个包含 32 位库,另一个包含 64 位库)。

在 Windows 中,以下命令行形式可以正常工作:

java -Djava.library.path=nativelib64 -classpath myapp.jar;jni_lib.jar MyApplication
Run Code Online (Sandbox Code Playgroud)

但是 AIX 和 Linux 上的等效项(基本上是类路径中的分号替换为冒号)失败并出现 UnsatisfiedLinkErrors - 我不得不在调用之前显式设置 LIBPATH 或 LD_LIBRARY_PATH,因为我没有尝试过将 -Djava.library.path 设置为(例如“nativelib64”,“./nativelib64”,“/full/path/to/myappdir/nativelib64”)似乎有效。

UNIX 版本的 JVM 不支持从命令行设置 java.library.path 属性吗?

java linux java-native-interface aix

1
推荐指数
1
解决办法
3984
查看次数

Android Studio NDK 返回 jint

我已成功按照本教程https://www.youtube.com/watch?v=kFtxo7rr2HQ学习如何使用 Android Studio 构建 NDK 应用程序。

该教程使用了public native String HelloJNI();

HelloJNI.c该字符串在文件中设置

#include "com_example_myapplication_MainActivity.h"
/* Header for class com_example_myapplication_MainActivity */

/*
 * Class:     com_example_myapplication_MainActivity
 * Method:    HelloJNI
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_example_myapplication_MainActivity_HelloJNI
  (JNIEnv *env, jobject obj)
  {
(*env)->NewStringUTF(env, "Hello from jni");
}
Run Code Online (Sandbox Code Playgroud)

并在运行时加载

static{
    System.loadLibrary("HelloJNI");
    }
Run Code Online (Sandbox Code Playgroud)

现在我试图做同样的事情,但检索而int不是string public native int getintONE();

我按照教程中的相同步骤操作,一切正常,现在我的getintONE.c阅读

#include "com_example_myapplication_MainActivity.h"
/*
 * Class:     com_example_myapplication_MainActivity
 * Method:    getintONE
 * Signature: ()I
 */
JNIEXPORT jint JNICALL com_example_myapplication_MainActivity_getintONE …
Run Code Online (Sandbox Code Playgroud)

java-native-interface android android-ndk

1
推荐指数
1
解决办法
3401
查看次数

如何生成 React Native 的 Android jni 库

Android 上的 React Native 有一些 C/C++ 代码可以编译为 .so 文件。我如何构建这些 .so 文件?我认为这与https://github.com/facebook/react-native/blob/master/ReactAndroid/src/main/jni/Application.mk有关。

我尝试创建一个新的 React Native 项目并从项目根运行以下命令:

NDK_PROJECT_PATH=node_modules/react-native/ReactAndroid/src/main $ANDROID_HOME/ndk-bundle/ndk-build
Run Code Online (Sandbox Code Playgroud)

但我收到一个错误:

Android NDK: Your APP_BUILD_SCRIPT points to an unknown file: Android.mk
Run Code Online (Sandbox Code Playgroud)

java-native-interface android android-ndk react-native

1
推荐指数
1
解决办法
2095
查看次数

如何在IDEA和Visual Studio环境下联合调试JNI程序

我正在编写 JNI 程序,但程序出现问题,并且数据不符合预期。Java程序在IDEA环境下启动。随着程序不断运行,当代码执行到一个断点时,这个断点就是java调用动态库的地方。我想让Visual Studio接管程序,以便我可以调试和观察数据。

我用google搜索解决方案,没有看到相应的图文教程,不确定这个解决方案是否可行。

如果你可以调试,任何代码都可以

如果可以的话,希望您能提供图文教程,或者建议一些步骤,非常感谢。

debugging java-native-interface intellij-idea visual-studio

1
推荐指数
1
解决办法
1916
查看次数

JNI返回Java对象,是否可以返回本地引用,还是必须是全局引用?

假设在 JNI 方法中我想返回一个 Java 字符串(或任何其他 Java 对象)。返回的对象可以是在该方法中创建的本地引用,还是应该将返回值转换为全局引用?

简单的例子:

extern "C"
JNIEXPORT jstring JNICALL Java_some_package_SomeObj_getStringTest(JNIEnv *env, jclass obj)
{
    return env->NewString("Test", 4); // OK to return local reference?
}
Run Code Online (Sandbox Code Playgroud)

或者应该是:

extern "C"
JNIEXPORT jstring JNICALL Java_some_package_SomeObj_getStringTest(JNIEnv *env, jclass obj)
{
    jstring str = env->NewString("Test", 4);
    return env->NewGlobalRef(str); // Must return a global reference?
}
Run Code Online (Sandbox Code Playgroud)

c++ java java-native-interface return-type

1
推荐指数
1
解决办法
958
查看次数

JNI 在应用程序中检测到错误:输入无效修改的 UTF-8:非法起始字节 0xf0

我的应用程序崩溃了,logcat 显示此信息"" JNI 在应用程序中检测到错误:输入无效修改的 UTF-8:非法起始字节 0xf0""

logcat 显示了这一点

03-19 10:39:29.491 25489-25517/org.aitech.ai.debug A/art: sart/runtime/check_jni.cc:65] JNI 在应用程序中检测到错误:输入无效修改的 UTF-8:非法启动字节 0xf0 03-19 10:39:29.491 25489-25517/org.aitech.ai.debug A/art: sart/runtime/check_jni.cc:65] 字符串:


'ZA_SPEENA_JALLABI__YAMA_LALAI_ME_GHANAM__RANG_DE_(_BY_ARYANA_SAEED_) (128k).mp3' 03-19 10:39:29.491 25489-25517/org.aitech.ai.debug A/art: sart/runtime/check_jni.cc:65] 调用 NewString 03- 19 10:39:29.491 25489-25517/org.aitech.ai.debug A/art: sart/runtime/check_jni.cc:65] 来自 org.aitech.medialibrary.interfaces.media.MediaWrapper[] org.aitech.medialibrary .MedialibraryImpl.nativeGetSortedPagedAudio(int, boolean, int, int) 03-19 10:39:29.491 25489-25517/org.aitech.ai.debug A/art: sart/runtime/check_jni.cc:65] "arch_disk_io_1" prio =5 tid=20 可运行 03-19 10:39:29.491 25489-25517/org.aitech.ai.debug A/art: sart/runtime/check_jni.cc:65] | 组=“主”sCount=0 dsCount=0 obj=0x13054160 self=0xdd476000 03-19 10:39:29.491 25489-25517/org.aitech.ai.debug A/art: sart/runtime/check_jni.cc:65] | sysTid=25517 好=0 cgrp=默认 sched=0/0 句柄=0xf4923080 03-19 10:39:29.491 25489-25517/org.aitech.ai.debug A/art: …

java-native-interface android-ndk

1
推荐指数
1
解决办法
9421
查看次数

Android 工作室 | CPP 文件错误错误:位图库中未定义对“AndroidBitmap_unlockPixels”的引用

我正在尝试使用AndroidJniBitmapOperations库。但我是一名初级开发人员,对 NDK、JNI 世界一无所知。

我成功解决了一些错误,例如“UnsatisfiedLinkError”,但现在当我尝试构建时遇到了一个新错误:

错误:未定义对“AndroidBitmap_unlockPixels”的引用

另外,我在 CPP 文件中发现了一些错误:

1.“参数‘prmeterName’的类型不正确,其类型应为‘jint’。

2.“添加外部'C'”

但我不确定最后两个是否重要。

帮助我更新这个库,因为它很重要并且多次讨论过,例如:here

库本身的链接: https://github.com/AndroidDeveloperLB/AndroidJniBitmapOperations

到目前为止我所做的一切是: https: //github.com/LiorA1/MyRevApp

c++ java-native-interface android android-ndk

1
推荐指数
1
解决办法
1328
查看次数

使用 fstream 读取文件然后关闭并再次读取在 Android 上不起作用

我遇到了一个问题,如果我写入文件并从中读取,那么一切都很好。但是如果我关闭它并重新打开它,所有数据都消失了。

它在 Android 上运行,并且filePath2来自getExternalFilesDir,所以我不需要写入磁盘的权限。这是将在 Android Studio 上的新 JNI 项目上运行的最小可重现示例:

    ALOGV(TAG, "gonna open filePath2: %s", filePath2.c_str());
    f.open(filePath2, std::ios_base::binary | std::ios_base::trunc | std::ios_base::in | std::ios_base::out);
    if (f.is_open()) {
        ALOGV(TAG, "is open");
    } else {
        ALOGV(TAG, "is closed");
    }
    //Write some data to vector
    std::vector<char> v;
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);
    v.push_back(4);
    v.push_back(5);
    //Write the vector to file
    f.write(v.data(), v.size());
    f.flush();
    //Lets read so we see that things were written to the file
    ALOGV(TAG, "seeking g and p to beggining");
    f.seekg(0, …
Run Code Online (Sandbox Code Playgroud)

c++ java-native-interface android fstream

1
推荐指数
1
解决办法
50
查看次数

如果 Get&lt;&gt;ArrayElements 返回的指针数组对应的 Release&lt;&gt;ArrayElements 模式是 JNI_COMMIT,我们是否应该删除/释放它?

当调用 JNI 函数时,Get<PrimitiveType>ArrayElements它将返回一个 CJNI NativeType指针数组,该数组可能是原始 JARRAY 的副本,或者是直接指向 JARRAY 原始值的指针。

Release<PrimitiveType>ArrayElements当模式为0orJNI_ABORTjboolean输出*isCopy设置为时,它还有相应的释放缓冲区JNI_TRUE,但如果模式为 则不释放缓冲区JNI_COMMIT

所以我的问题是,如果我们将相应的模式设置为因为该模式不会释放缓冲区,那么我们是否应该free/完成后delete[]返回的指针?Get<PrimitiveType>ArrayElementsRelease<PrimitiveType>ArrayElementsJNI_COMMIT

JNI_COMMIT 复制回内容但不释放 elems 缓冲区


[编辑]

我的缺点是我没有立即看到它Get<PrimitiveType>ArrayRegion不返回数组指针,我将原来的第二个问题更新为主要问题。

c++ java-native-interface

1
推荐指数
1
解决办法
96
查看次数