标签: java-native-interface

如何使用jni将数据从java InputStream移动到c ++中的char *?

如何使用 JNI 将存储在 java InputStream 中的数据移动到 c++ 中的 char *?

谢谢,卡洛斯。

c++ java java-native-interface inputstream

0
推荐指数
1
解决办法
4963
查看次数

在单独的类中使用 Java 本机方法时出现 UnsatisfiedLinkError

我正在使用 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)

java java-native-interface

0
推荐指数
1
解决办法
2338
查看次数

通过JNI或JNA注册从Java到C的回调

我有一个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?示例代码非常受欢迎.

java java-native-interface jna

0
推荐指数
1
解决办法
2610
查看次数

为什么C函数不能将正确的参数传递给java?

在我的测试中,我想从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)

c java java-native-interface android

0
推荐指数
1
解决办法
84
查看次数

JNI:将多维java数组传递给c程序

在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)

c java java-native-interface

0
推荐指数
1
解决办法
387
查看次数

来自 C++ 的 JNI Java;打印输出?

我使用 JNI 在 C++ 程序中调用一些 Java 代码。我需要将一些文本从 Java 打印到 C++ 标准输出。

我该怎么做?

我尝试:System.out.println("sdf");在java中,什么也没有出现。

请帮助:D

c++ java java-native-interface stdout

0
推荐指数
1
解决办法
7360
查看次数

方法的jni签名

我的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)

如果我只保留两个字符串,一切正常.但是有两个整数会引发错误?我究竟做错了什么?

c++ java java-native-interface

0
推荐指数
1
解决办法
3178
查看次数

Java字节数组到ByteBuffer或ByteBuffer到字节数组转换"没有复制"

这是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 java-native-interface nio

0
推荐指数
1
解决办法
5523
查看次数

JNI GetLongField失败,"jni对类java.lang.Class的对象无效"

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的对象无效"

java java-native-interface android android-ndk

0
推荐指数
1
解决办法
1530
查看次数

在C中的read()是否读取空字符

我已经编写了从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()是否将空字符读取为数据?

c java-native-interface serial-port

0
推荐指数
1
解决办法
748
查看次数