假设我有一个名为 Scope 的类,它有一个名为 Variable 的嵌套类,我到底如何使用它javap -s来获取内部类的 JNI 签名?我试过做
javap -classpath <classpath> -s Scope$Variable
,但这似乎不起作用。它似乎只是给我提供了相同的信息,就像我只输入“Scope”而不是“Scope$Variable”一样。
谢谢你的帮助
我有一个 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 属性吗?
我已成功按照本教程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) 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) 我正在编写 JNI 程序,但程序出现问题,并且数据不符合预期。Java程序在IDEA环境下启动。随着程序不断运行,当代码执行到一个断点时,这个断点就是java调用动态库的地方。我想让Visual Studio接管程序,以便我可以调试和观察数据。
我用google搜索解决方案,没有看到相应的图文教程,不确定这个解决方案是否可行。
如果你可以调试,任何代码都可以
如果可以的话,希望您能提供图文教程,或者建议一些步骤,非常感谢。
假设在 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) 我的应用程序崩溃了,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: …
我正在尝试使用AndroidJniBitmapOperations库。但我是一名初级开发人员,对 NDK、JNI 世界一无所知。
我成功解决了一些错误,例如“UnsatisfiedLinkError”,但现在当我尝试构建时遇到了一个新错误:
错误:未定义对“AndroidBitmap_unlockPixels”的引用
另外,我在 CPP 文件中发现了一些错误:
1.“参数‘prmeterName’的类型不正确,其类型应为‘jint’。
2.“添加外部'C'”
但我不确定最后两个是否重要。
帮助我更新这个库,因为它很重要并且多次讨论过,例如:here。
库本身的链接: https://github.com/AndroidDeveloperLB/AndroidJniBitmapOperations
到目前为止我所做的一切是: https: //github.com/LiorA1/MyRevApp
我遇到了一个问题,如果我写入文件并从中读取,那么一切都很好。但是如果我关闭它并重新打开它,所有数据都消失了。
它在 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) 当调用 JNI 函数时,Get<PrimitiveType>ArrayElements它将返回一个 CJNI NativeType指针数组,该数组可能是原始 JARRAY 的副本,或者是直接指向 JARRAY 原始值的指针。
Release<PrimitiveType>ArrayElements当模式为0orJNI_ABORT且jboolean输出*isCopy设置为时,它还有相应的释放缓冲区JNI_TRUE,但如果模式为 则不释放缓冲区JNI_COMMIT。
所以我的问题是,如果我们将相应的模式设置为因为该模式不会释放缓冲区,那么我们是否应该free/完成后delete[]返回的指针?Get<PrimitiveType>ArrayElementsRelease<PrimitiveType>ArrayElementsJNI_COMMIT
JNI_COMMIT 复制回内容但不释放 elems 缓冲区
[编辑]
我的缺点是我没有立即看到它Get<PrimitiveType>ArrayRegion不返回数组指针,我将原来的第二个问题更新为主要问题。
android ×4
android-ndk ×4
c++ ×4
java ×3
aix ×1
command-line ×1
debugging ×1
fstream ×1
linux ×1
react-native ×1
return-type ×1