标签: java-native-interface

44
推荐指数
3
解决办法
5万
查看次数

在JNI中使用它时出现Javah错误

命令:

javah -jni JavaHowTo
Run Code Online (Sandbox Code Playgroud)

结果:

error: cannot access JavaHowTo 
class file for JavaHowTo not found

javadoc: error - Class JavaHowTo not found.
Error: No classes were specified on the command line.  Try -help.
Run Code Online (Sandbox Code Playgroud)

我已正确设置类路径,但我仍然收到此javah错误.

任何解决方案都会有所帮助.

java java-native-interface classpath

43
推荐指数
4
解决办法
5万
查看次数

NDK - 如何在另一个项目中使用生成的.so库

我已成功使用ndk .so在一个项目中构建和使用文件.我需要在另一个项目中使用这个库.我宁愿不复制源代码,只是使用库.

尝试将整个复制并粘贴libs/armeabi/libcommon.so到项目根目录不起作用,我认为因为libs/armeabi是一个android生成的路径.

那么最好的方法是什么呢?

我正在使用Eclipse-Galileo&ndk5.

java-native-interface android android-ndk

43
推荐指数
3
解决办法
4万
查看次数

来自Android JNI中任何线程的FindClass

Android的JNI提示页面提到了这个FAQ:为什么FindClass找不到我的课程? 他们提到了多个解决方案,最后一个选项就是这个:

在某个地方缓存对ClassLoader对象的引用,并直接发出loadClass调用.这需要一些努力.

所以,我试图让它工作,似乎无论如何,这种方法根本不适合我.最后,我想到了如何使用ClassLoader但是如果从本机线程尝试未被触摸/加载的loadClass它将无法工作.本质上,当从本机线程调用时,它与行为中的env-> FindClass相同,但是对于已在应用程序中使用的类,它不会返回0.任何想法,如果我没有正确,或者无法从原生线程访问尚未使用/加载的类.






编辑:我会提供更多信息来解释我的意思.有常规的JNI env->FindClass(className),我写的另一个myFindClass(env, className)使用缓存ClassLoader->loadClass.

我试图从本机c/c ++访问的类是"com/noname/TestClient".在myFindClass里面我也使用它返回的env-> FindClass和log值:

jclass myFindClass(JNIEnv * env, const char* name)
{
    ...
    jclass c0 = env->FindClass(name);
    jclass c1 = (jclass)env->CallObjectMethod(ClassLoader,
        MID_loadClass, envNewStringUTF(name));
    dlog("myFindClass(\"%s\") => c0:%p, c1:%p, c0 and c1 are same: %d",
        name, c0, c1, env->IsSameObject(c0, c1));
    ...
}
Run Code Online (Sandbox Code Playgroud)

然后,我有这三种组合来解释这个问题.

1)

//inside JNI_OnLoad thread
myFindClass(env, "com/noname/TestClient");
...

//inside native thread created by pthread_create
myFindClass(env, "com/noname/TestClient");
Run Code Online (Sandbox Code Playgroud)

我得到这个logcat:

myFindClass("com/noname/TestClent")=> c0:0x41b64558,c1:0x41b64558,c0和c1相同:1
...
myFindClass("com/noname/TestClent")=> c0:0,c1:0x41b64558, c0和c1相同:0

2)

//inside JNI_OnLoad …
Run Code Online (Sandbox Code Playgroud)

c++ java-native-interface android

43
推荐指数
2
解决办法
3万
查看次数

如何获取在NDK应用程序中编写的"printf"消息?

如果我在java文件中定义这样的功能

  /** 
   * Adds two integers, returning their sum
   */
  public native int add( int v1, int v2 );
Run Code Online (Sandbox Code Playgroud)

所以我需要在c文件中编码

JNIEXPORT jint JNICALL Java_com_marakana_NativeLib_add
  (JNIEnv * env, jobject obj, jint value1, jint value2) {

  printf("\n this is log messge \n");

        return (value1 + value2);
}
Run Code Online (Sandbox Code Playgroud)

然后从这个printf将打印它的消息?在logcate我不明白吗?

如何通过放置日志消息来调试任何NDK应用程序?

c java-native-interface logging android android-ndk

42
推荐指数
3
解决办法
6万
查看次数

如何在intelliJ Idea中设置java.library.path

有谁可以请帮助我如何解决此错误:

Native code library failed to load.
java.lang.UnsatisfiedLinkError: no ts-jni in java.library.path
Run Code Online (Sandbox Code Playgroud)

我是第一次使用IDEA IDE,并且一直使用Resin_4.0.37作为服务器来测试我的工作.一旦我在调试模式下启动我的lcoal服务器,它会停留大约1-2分钟,然后突然它下降并通过给我上述错误而断开连接.

我正确设置了我的Windows环境变量; 并且还在我的IDE intelliJ中执行了以下操作:

 FILE->Project Structure->set Global Libraries->a. Java path and b. Resin library path.
Run Code Online (Sandbox Code Playgroud)

任何人都可以建议我,我做错了什么,如何在intelliJ IDEA中设置本机库来解决上述错误.

任何帮助,将不胜感激.如果我做错了,也要纠正我.

谢谢!

java java-native-interface resin intellij-idea

41
推荐指数
1
解决办法
6万
查看次数

NewStringUTF()和释放内存

传递后,我应该释放分配的字符串NewStringUTF()吗?

我有一些类似的代码:

char* test;
jstring j_test;

test = some_function(); // <- malloc()s the memory
j_test = (*env)->NewStringUTF(env, test);

free(test); // <- should this be here?
Run Code Online (Sandbox Code Playgroud)

当我将字符串传递给它后释放它时NewStringUTF(),我收到一个signal 11 (SIGSEGV), fault addr deadbaad错误.如果我删除了free()呼叫,则错误消失.我究竟做错了什么?

我看到相互矛盾的意见.有人说我应该自己释放它,有人说VM会释放它,有人说VM没有释放它,你应该做一些奇怪的伏都魔术来释放它.我糊涂了.

java java-native-interface

40
推荐指数
2
解决办法
5万
查看次数

从.aar文件Android中提取代码

如何从aar文件中提取代码.[无意中我的主项目在另一个系统上无法访问我的邮件上只有aar文件]

我需要从aar文件中提取JNI代码.我试图将扩展名更改为.jar但仅提取.class,有人知道如何提取那些aar的东西.

java-native-interface android android-ndk

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

如何在linux上为JNI应用程序编译动态库?

我正在使用Ubuntu 10.10

这就是我做的.

Hello.java:

class Hello {
        public native void sayHello();

        static { System.loadLibrary("hellolib"); }

        public static void main(String[] args){
                Hello h = new Hello();
                h.sayHello();
        }
}
Run Code Online (Sandbox Code Playgroud)

然后我运行了以下命令:

dierre@cox:~/Scrivania/provajni$ javac Hello.java

dierre@cox:~/Scrivania/provajni$ javah -jni Hello 
Run Code Online (Sandbox Code Playgroud)

我获得Hello.classHello.h.

你好:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class Hello */

#ifndef _Included_Hello
#define _Included_Hello
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     Hello
 * …
Run Code Online (Sandbox Code Playgroud)

c++ java linux java-native-interface compilation

38
推荐指数
3
解决办法
8万
查看次数

发生JNI错误,请检查您的安装并在Eclipse x86 Windows 8.1中重试

public class LoginCumReg implements ActionListener,KeyListener {
    private JFrame form;
    private JTextField txtunm;
    private JTextField txtnm;
    private JTextField txteml;
    private JButton cmdcreate;
    private JPasswordField txtpass;
    private JPasswordField txtpassreg;
    private JButton cmdok;
    private JLabel lblunm;
    private JLabel lblpass;
    private JLabel lbleml;
    private JLabel lblpassreg;
    private JLabel lblnm;
    private JPanel panel_1;
public LoginCumReg() {
    // construct components
    form = new JFrame("Sign Up");
    form.getContentPane().setFont(
            new Font("Plantagenet Cherokee", Font.BOLD, 18));
    txtunm = new JTextField(5);
    txtunm.addKeyListener(this);
    txtunm.setBounds(637, 55, 100, 25);
    txtnm = new JTextField(5);
    txtnm.setBounds(637, 228, …
Run Code Online (Sandbox Code Playgroud)

java mysql eclipse java-native-interface

38
推荐指数
9
解决办法
34万
查看次数