如何使用 JNI 将存储在 java InputStream 中的数据移动到 c++ 中的 char *?
谢谢,卡洛斯。
我正在使用 Java 本机接口访问我在 C++ 中创建的 DLL 中的几个本机方法。我可以毫无问题地加载库,但我只能调用位于 Java 应用程序主类中的方法。换句话说,只要我声明方法并将 loadLibrary 命令放在主类中,一切都可以完美运行。
但是,如果我尝试放置 loadLibrary 命令,并在单独的类中声明本机方法,则会出现以下错误:
Exception in thread "main" java.lang.UnsatisfiedLinkError: sdr_api.SDR_API_Interface.SetDebugFlag_Native(Z)V
at sdr_api.SDR_API_Interface.SetDebugFlag_Native(Native Method)
at sdr_api.SDR_API_Interface.SetDebugFlag(SDR_API_Interface.java:74)
at sdr_api.SDR_API.main(SDR_API.java:183)
Run Code Online (Sandbox Code Playgroud)
我尝试查看 JNI 文档以检查是否要求必须在主类中声明所有本机方法,但我找不到任何内容。我想将这些方法移到一个单独的类中,因为我需要在单独的线程中使用它们(我只需要该类的一个实例,因此可以在必要时将它们声明为静态)。
我最好的猜测是在特定类中声明方法会以某种方式改变它们在 DLL 中的调用方式,但我不知道如何。
任何帮助将不胜感激!
编辑:添加了相关的代码示例
SDR_API 类:
package sdr_api;
public class SDR_API
{
public static void main(String[] args)
{
try
{
double Rate = 2e5;
double TxRxFreq = 5e9;
double RxGain = 0;
double TxGain = 0;
SDR_API_Interface mySDRAPI = new SDR_API_Interface();
mySDRAPI.SetDebugFlag(true);
mySDRAPI.Setup_BS_Config("addr=192.168.10.2",Rate,Rate,TxRxFreq,TxRxFreq,RxGain,TxGain);
mySDRAPI.Setup_MT_Config("addr=192.168.20.2",Rate,Rate,TxRxFreq,TxRxFreq,RxGain,TxGain);
}
catch(Exception e)
{
System.err.println("Exception …Run Code Online (Sandbox Code Playgroud) 我有一个C API,我想在Java应用程序中使用.我不是JNI的新手,但我不知道JNA这次是不是更好的选择.本机函数"RegisterCallback"通过调用函数指针定期发送来自另一个线程的更新.如何通过JNI/JNA将Java函数注册到此本机函数指针(void*pFunc)?
typedef unsigned long DWORD;
typedef void* HANDLE;
typedef enum _Type
{
Update,
Result
} TYPE;
DWORD RegisterCallback(HANDLE handle, TYPE type, void *pFunc);
Run Code Online (Sandbox Code Playgroud)
你怎么看?JNA还是JNI?示例代码非常受欢迎.
在我的测试中,我想从C调用Java并传递一个long类型参数,当我使用long类型时,在Java方法中,传入的参数无法正确获取,它始终是4294967297.但是当我尝试使用int类型时一切都很好.有谁知道什么是错的?
JAVA:
public static void test(long num) {
Log.d("test", "xxxxxxxxxxx:%ld" + String.valueOf(num));
}
Run Code Online (Sandbox Code Playgroud)
C:
void test_jni()
{
long num = 5000;
jclass theClass = (*currentJNIEnv)->FindClass(currentJNIEnv, "me/example/something/TestClass");
if (NULL != theClass) {
jmethodID mid = (*currentJNIEnv)->GetStaticMethodID(currentJNIEnv, theClass, "test", "(J)V");
if (mid == 0) return;
(*currentJNIEnv)->CallStaticVoidMethod(currentJNIEnv, theClass, mid, num);
}
}
Run Code Online (Sandbox Code Playgroud) 在Java中,Integer[][] arr定义了例如非原始对象的多维数组.如何arr通过JNI 访问C程序中的数组?
public class Foo {
public static Integer[][] arr = {{0}, {1, 2}, {3, 4, 5}};
}
Run Code Online (Sandbox Code Playgroud) 我使用 JNI 在 C++ 程序中调用一些 Java 代码。我需要将一些文本从 Java 打印到 C++ 标准输出。
我该怎么做?
我尝试:System.out.println("sdf");在java中,什么也没有出现。
请帮助:D
我的java方法包含一个函数
public static void downLoadProfileImage(String url, String fileName, int tag, int from)
Run Code Online (Sandbox Code Playgroud)
我收到JNI签名错误:
if (JniHelper::getStaticMethodInfo(jniMethodInfo, packageName.c_str(), "downLoadProfileImage", "(Ljava/lang/String;Ljava/lang/String;I;I;)V"))
Run Code Online (Sandbox Code Playgroud)
如果我只保留两个字符串,一切正常.但是有两个整数会引发错误?我究竟做错了什么?
这是java数组中最大的问题,它们需要复制才能进行编辑.我正在使用AMD Aparapi,我从计算中得到字节数组.我需要将字节数组显示为bytebuffer"不复制"
byte aparapiData[];
ByteBuffer buffer;
...
//here bytebuffer
buffer.clear();
buffer.put(aparapiData);
buffer.flip();
socket.write(buffer);
Run Code Online (Sandbox Code Playgroud)
代码中的问题,buffer.put是将字节数组复制到bytebuffer.并且还有将字节数组转换为bytebuffer的反向问题.
他们真的需要复制数据吗?我可以在不复制的情况下在C++上发送纯数据.
我怎样才能在Java上解决这个问题?
java代码:
public class Foo {
private long i = 0;
void printI() {
nativePrintI();
}
private native static void nativePrintI();
}
Run Code Online (Sandbox Code Playgroud)
JNI代码:
JNIEXPORT void JNICALL Java_com_aliyun_livestream_Publisher_nativeRelease
(JNIEnv *env, jobject obj) {
jclass cls = env->GetObjectClass(obj);;
jfieldID iField = env->GetFieldID(cls, "i", "J");
jlong i = env->GetLongField(obj, iField);
printf("%lld\n", i);
}
Run Code Online (Sandbox Code Playgroud)
我的被叫者是这样的:
Foo foo = new Foo();
foo.printI();
Run Code Online (Sandbox Code Playgroud)
有时它工作正常,但有时它失败了消息""jni对类java.lang.Class的对象无效"
我已经编写了从USB端口读取的程序(未连接任何东西)。从Java中我传递了int filedescriptor和字节数组,在jni中,我将字节数组转换为char *并使用了read()。
jbyte *bufferPtr2 = (*env)->GetByteArrayElements(env, buf, NULL);
unsigned char* d_data2 = (unsigned char*)bufferPtr2;
n = read(fd, d_data2, lengthOfArray);
Run Code Online (Sandbox Code Playgroud)
执行后,n = 1,但d_data2为空。为什么是这样?read()是否将空字符读取为数据?
java ×9
c ×3
c++ ×3
android ×2
android-ndk ×1
inputstream ×1
jna ×1
nio ×1
serial-port ×1
stdout ×1