有问题的图书馆是东京内阁.
我想要在一个JAR文件中包含本机库,JNI库和所有Java API类,以避免重新分发问题.
似乎在GitHub尝试了这个,但是
问题是,我可以将所有内容捆绑在一个JAR中并重新分发吗?如果有,怎么样?
PS:是的,我意识到它可能具有可移植性的含义.
我正在将一个项目转移到新的Android Native Development Kit(即JNI),我想抓住SIGSEGV,如果它发生(可能还有SIGILL,SIGABRT,SIGFPE),以便提供一个很好的崩溃报告对话框,而不是(或之前)当前发生的事情:该过程立即毫不客气地死亡,并且可能是操作系统重启它的一些尝试.(编辑: JVM/Dalvik VM捕获信号并记录堆栈跟踪和其他有用信息;我只是想为用户提供将该信息真正通过电子邮件发送给我的选项.)
情况是:我没有编写的大量C代码完成了这个应用程序中的大部分工作(所有游戏逻辑),虽然它在很多其他平台上都经过了很好的测试,但我完全有可能在我的Android中端口,将它提供垃圾并导致本机代码崩溃,所以我想要当前显示在Android日志中的崩溃转储(本机和Java)(我想在非Android情况下它将是stderr).我可以随意修改C和Java代码,尽管回调(进入和退出JNI)的数量大约为40,显然,小差异的奖励积分.
我听说过J2SE中的信号链接库,libjsig.so,如果我可以在Android上安全地安装这样的信号处理程序,这将解决我的问题的捕捉部分,但我看不到Android/Dalvik这样的库.
java-native-interface android signals segmentation-fault android-ndk
我正在使用Eclipse 3.5,我创建了一个包含一些包结构和默认包的项目.我在默认包中有一个类 - Calculations.java,我想在任何一个包中使用该类(例如in com.company.calc).当我尝试使用默认包中的类时,它给了我一个编译器错误.它无法识别默认包中的类.问题出在哪儿?
Calculations.java - 源代码
public class Calculations {
native public int Calculate(int contextId);
native public double GetProgress(int contextId);
static {
System.loadLibrary("Calc");
}
}
Run Code Online (Sandbox Code Playgroud)
我不能把我的班级放在任何其他包中.这个类有一些在Delphi中实现的本机方法.如果我将该类放在任何文件夹中,我将不得不对我想要避免的DLL进行更改(实际上 - 我不能).这就是为什么我把我的类放在默认包中.
如何在我的Web应用程序中加载自定义dll文件?我尝试了以下方法,但失败了.
system32文件夹中所有必需的dll 并尝试在Servlet构造函数中加载其中一个System.loadLibrarytomcat_home/shared/lib和中复制所需的dlltomcat_home/common/libWEB-INF/libweb应用程序中我正在尝试从C++获取一个简单的Java方法调用,而Java调用本机方法.这是Java代码:
public class MainActivity extends Activity {
private static String LIB_NAME = "name";
static {
System.loadLibrary(LIB_NAME);
}
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
TextView tv = (TextView) findViewById(R.id.textview);
tv.setText(this.getJniString());
}
public void messageMe(String text) {
System.out.println(text);
}
public native String getJniString();
}
Run Code Online (Sandbox Code Playgroud)
我试图messageMe在getJniString*从Java到本机的方法调用过程中从本机代码调用方法.
native.cpp:
#include <string.h>
#include <stdio.h>
#include <jni.h>
jstring Java_the_package_MainActivity_getJniString( JNIEnv* env, jobject obj, jint depth ){
// JavaVM *vm;
// JNIEnv *env; …Run Code Online (Sandbox Code Playgroud) 我正在开发一个使用JNI的Java项目.JNI调用我自己编写的自定义库,比如mylib.dll,这取决于第三方库libsndfile-1.dll.
当我运行我的程序时,它崩溃了
java.lang.UnsatisfiedLinkError: C:\...path...\mylib.dll: Can't find dependent libraries.
Run Code Online (Sandbox Code Playgroud)
我搜索了这个网站(和其他人),我尝试了一些修复:
我跑了依赖沃克.DW给出了一些警告 - libsndfile,MPR.DLL和SHLWAPI.DLL所需的两个库具有"未解析的导入" - 但DW FAQ表示可以安全地忽略这些警告.
我修复了mylib.dll中的方法名称,如此处所示.方法名称在某种程度上被编译器破坏了,但我添加了链接器标志,现在dll方法名称与我的jni头文件中的名称完全匹配.
我将所有这些DLL放在同一目录中 - 与调用它们的.jar相同的目录 - 以确保它们位于正确的PATH上.
没有骰子.
有谁知道发生了什么事?
我正在使用MacBook pro(通过Parallels)在Visual Studio 2010中进行开发.我正在使用toshiba笔记本电脑在Windows XP上进行测试.
我正在尝试将原生代码添加到我的应用中.我../main/jni在Eclipse项目中拥有所有内容.我加入ndk.dir=...了我的local.properties.我还没有做任何其他事情(我不确定还有什么需要,所以如果我错过了什么让我知道).当我尝试构建时,我收到此错误:
Execution failed for task ':app:compileDebugNdk'.
> com.android.ide.common.internal.LoggedErrorException: Failed to run command:
/Users/me/android-ndk-r8e/ndk-build NDK_PROJECT_PATH=null
APP_BUILD_SCRIPT=/Users/me/Project/app/build/ndk/debug/Android.mk APP_PLATFORM=android-19
NDK_OUT=/Users/me/Project/app/build/ndk/debug/obj
NDK_LIBS_OUT=/Users/me/Project/app/build/ndk/debug/lib APP_ABI=all
Error Code:
2
Output:
make: *** No rule to make target `/Users/me/Project/webapp/build/ndk/debug//Users/me/Project/app/src/main/jni/jni_part.cpp',
needed by `/Users/me/Project/app/build/ndk/debug/obj/local/armeabi-v7a/objs/webapp//Users/me/Project/app/src/main/jni/jni_part.o'.
Stop.
Run Code Online (Sandbox Code Playgroud)
我需要做什么?
Android.mk:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
# OpenCV
OPENCV_CAMERA_MODULES:=on
OPENCV_INSTALL_MODULES:=on
include .../OpenCV-2.4.5-android-sdk/sdk/native/jni/OpenCV.mk
LOCAL_MODULE := native_part
LOCAL_SRC_FILES := jni_part.cpp
LOCAL_LDLIBS += -llog -ldl
include $(BUILD_SHARED_LIBRARY)
Run Code Online (Sandbox Code Playgroud)
Application.mk:
APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions
APP_ABI := armeabi armeabi-v7a
APP_PLATFORM …Run Code Online (Sandbox Code Playgroud) java-native-interface android gradle android-ndk-r7 android-studio
Rob Gordon的"Essential JNI:Java Native Interface"一书包含以下代码示例,用于将jstring转换为C字符串:
const char* utf_string;
jboolean isCopy;
utf_string = env->GetStringUTFChars(str, &isCopy);
/* ... use string ... */
if (isCopy == JNI_TRUE) {
env->ReleaseStringUTFChars(str, utf_string);
}
Run Code Online (Sandbox Code Playgroud)
需要注意的是它只调用ReleaseStringUTFChars,如果isCopy是真实的.
但是Java Native Interface:Programmer's Guide and Specification(备用链接:)这本书http://192.9.162.55/docs/books/jni/html/objtypes.html#5161说:
无论GetStringChars将*isCopy设置为JNI_TRUE还是JNI_FALSE,都必须调用ReleaseString-Chars.ReleaseStringChars可以释放副本或取消实例,具体取决于GetStringChars是否返回了副本.
我认为这是戈登书中的一个错误是正确的吗?
我了解到JNI接口指针(JNIEnv*)仅在当前线程中有效.假设我在本机方法中启动了一个新线程; 它如何异步发送事件到Java方法?由于这个新线程不能有(JNIEnv*)的引用.为(JNIEnv*)存储全局变量显然不起作用?
在java中,registerNatives()Object类的私有静态方法有什么作用?
java ×8
android ×3
android-ndk ×2
c ×2
c++ ×1
clojure ×1
dll ×1
gradle ×1
jar ×1
libsndfile ×1
methods ×1
object ×1
signals ×1
windows-xp ×1