标签: java-native-interface

如何在JAR中捆绑本机库和JNI库?

有问题的图书馆是东京内阁.

我想要在一个JAR文件中包含本机库,JNI库和所有Java API类,以避免重新分发问题.

似乎在GitHub尝试了这个,但是

  1. 它不包括实际的本机库,只包括JNI库.
  2. 它似乎特定于Leiningen的native dependencies插件(它不能用作可再发行的插件).

问题是,我可以将所有内容捆绑在一个JAR中并重新分发吗?如果有,怎么样?

PS:是的,我意识到它可能具有可移植性的含义.

java java-native-interface jar clojure tokyo-cabinet

95
推荐指数
5
解决办法
8万
查看次数

如何在Android上的JNI下捕获SIGSEGV(分段错误)并获得堆栈跟踪?

我正在将一个项目转移到新的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

90
推荐指数
4
解决办法
6万
查看次数

如何从默认包导入类

可能重复:如何访问default-package中的java-classes?


我正在使用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进行更改(实际上 - 我不能).这就是为什么我把我的类放在默认包中.

java java-native-interface native-methods default-package

90
推荐指数
5
解决办法
14万
查看次数

Java.library.path中的java.lang.UnsatisfiedLinkError no*****.dll

如何在我的Web应用程序中加载自定义dll文件?我尝试了以下方法,但失败了.

  • 复制system32文件夹中所有必需的dll 并尝试在Servlet构造函数中加载其中一个System.loadLibrary
  • tomcat_home/shared/lib和中复制所需的dlltomcat_home/common/lib
  • 所有这些dll都在WEB-INF/libweb应用程序中

java dll java-native-interface web-applications

88
推荐指数
6
解决办法
33万
查看次数

在Android中从c ++调用java方法

我正在尝试从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)

我试图messageMegetJniString*从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)

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

88
推荐指数
2
解决办法
10万
查看次数

如何在JNI项目中修复UnsatisfiedLinkError(无法找到依赖库)

我正在开发一个使用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)

我搜索了这个网站(和其他人),我尝试了一些修复:

  1. 我跑了依赖沃克.DW给出了一些警告 - libsndfile,MPR.DLL和SHLWAPI.DLL所需的两个库具有"未解析的导入" - 但DW FAQ表示可以安全地忽略这些警告.

  2. 我修复了mylib.dll中的方法名称,如此处所示.方法名称在某种程度上被编译器破坏了,但我添加了链接器标志,现在dll方法名称与我的jni头文件中的名称完全匹配.

  3. 我将所有这些DLL放在同一目录中 - 与调用它们的.jar相同的目录 - 以确保它们位于正确的PATH上.

没有骰子.

有谁知道发生了什么事?

我正在使用MacBook pro(通过Parallels)在Visual Studio 2010中进行开发.我正在使用toshiba笔记本电脑在Windows XP上进行测试.

java java-native-interface windows-xp libsndfile

79
推荐指数
7
解决办法
30万
查看次数

Android Studio中的JNI和Gradle

我正在尝试将原生代码添加到我的应用中.我../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

74
推荐指数
5
解决办法
12万
查看次数

如果GetStringUTFChars返回副本,您应该调用ReleaseStringUTFChars吗?

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是否返回了副本.

我认为这是戈登书中的一个错误是正确的吗?

java java-native-interface

71
推荐指数
1
解决办法
4万
查看次数

如何获取异步调用的JNI接口指针(JNIEnv*)

我了解到JNI接口指针(JNIEnv*)仅在当前线程中有效.假设我在本机方法中启动了一个新线程; 它如何异步发送事件到Java方法?由于这个新线程不能有(JNIEnv*)的引用.为(JNIEnv*)存储全局变量显然不起作用?

c java java-native-interface multithreading

69
推荐指数
2
解决办法
6万
查看次数

registerNatives()方法有什么作用?

在java中,registerNatives()Object类的私有静态方法有什么作用?

c java methods java-native-interface object

68
推荐指数
2
解决办法
4万
查看次数