我可以通过JNI从Node.js调用Java 吗?有什么例子吗?
命令:
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错误.
任何解决方案都会有所帮助.
我已成功使用ndk .so在一个项目中构建和使用文件.我需要在另一个项目中使用这个库.我宁愿不复制源代码,只是使用库.
尝试将整个复制并粘贴libs/armeabi/libcommon.so到项目根目录不起作用,我认为因为libs/armeabi是一个android生成的路径.
那么最好的方法是什么呢?
我正在使用Eclipse-Galileo&ndk5.
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) 如果我在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应用程序?
有谁可以请帮助我如何解决此错误:
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中设置本机库来解决上述错误.
任何帮助,将不胜感激.如果我做错了,也要纠正我.
谢谢!
传递后,我应该释放分配的字符串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没有释放它,你应该做一些奇怪的伏都魔术来释放它.我糊涂了.
如何从aar文件中提取代码.[无意中我的主项目在另一个系统上无法访问我的邮件上只有aar文件]
我需要从aar文件中提取JNI代码.我试图将扩展名更改为.jar但仅提取.class,有人知道如何提取那些aar的东西.
我正在使用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.class和Hello.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) 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)