标签: java-native-interface

Android - java.lang.UnsatisfiedLinkError:未找到本机方法

IDE:安卓工作室

我有位于“jniLibs”文件夹下的静态库。

在此处输入图片说明

我也加载了那个库。这是我使用的代码:

static 
{
    System.loadLibrary("elianjni");
}
Run Code Online (Sandbox Code Playgroud)

本机方法在单独的类(ElianNative)上声明为:

public native int InitSmartConnection(String paramString, int paramInt1, int paramInt2);    

public native int StartSmartConnection(String paramString1, String paramString2, String paramString3, byte paramByte);
Run Code Online (Sandbox Code Playgroud)

但是,当我调用该方法时InitSmartConnection,应用程序崩溃了,错误是:

java.lang.UnsatisfiedLinkError: Native method not found: com.monitor.camera.connect.ElianNative.InitSmartConnection:(Ljava/lang/String;II)I

at com.monitor.camera.connect.ElianNative.InitSmartConnection(Native Method) 
Run Code Online (Sandbox Code Playgroud)

我不知道这可能的原因,因为我只是从另一个WORKING项目中复制了这个库,然后在声明方法和导入必要的头文件时做了同样的事情。

造成此类问题的可能原因是什么?我在堆栈上搜索,有人说这是.c文件中方法之前缺少Java关键字。但是,我不认为这可能是问题所在,因为就像我所说的,这是在另一个运行良好的项目中使用的。

java java-native-interface android

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

JNI 包装器从 C++ 读取列表并返回到 JAVA

我有一个要求,我需要使用 JNI 将一些值从 C++ 传递到 JAVA。根据要求,c++ 代码的输入是一条带有点列表的线,我必须读取每个点的 x 和 y 坐标并返回到 java 代码。我已将列表声明为 std::list> listofpoints; 并读取 x 和 y 坐标为

for(size_t j = 0; j < track->geometry.points.size(); ++j)
{

 PointZ &p = track->geometry.points[j]             listofpoints.push_back(std::pair<double, double>(p.vertex.position.x,p.vertex.position.y)); 
Run Code Online (Sandbox Code Playgroud)

这个 geometry.points 是读取每个点,获取 x 和 y 坐标。现在我将此 listofpoints 返回给 JNI 方法。在这里我必须编写代码,以便它读取 x 和 y 坐标并将其发送到 JAVA 方法。我正在寻找一种迭代列表并获取值的方法,但是,我发现很难从 JNI 返回到 JAVA,因为 JNI 仅返回 jobjectarray。如何将此列表转换为 JNI 中的数组并发送到 JAVA 方法。我对 JNI 和 JAVA 也很陌生。

c++ java java-native-interface stl

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

JNI 方法 CallObjectMethod、CallObjectMethodV 和 CallObjectMethodA 的区别是什么?

JNI CallObjectMethod中有3种方法 CallObjectMethodV CallObjectMethodA 那么这些方法有什么区别呢?

jobject     (*CallObjectMethod)(JNIEnv*, jobject, jmethodID, ...);
jobject     (*CallObjectMethodV)(JNIEnv*, jobject, jmethodID, va_list);
jobject     (*CallObjectMethodA)(JNIEnv*, jobject, jmethodID, jvalue*);
Run Code Online (Sandbox Code Playgroud)

c++ java java-native-interface

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

使用 Android Studio 构建共享 *.so 库的发布版本

我正在为 Android 制作一个 C++ 共享库。我使用 Android Studio 创建了新项目并启用了 C++。

在此处输入图片说明

我还启用了 C++ 11 ans 异常支持。

在此处输入图片说明

新项目已创建,build.gradle并且CMakeLists.text文件。问题是 Adnroid Studio 只生成 *.so 库的调试版本。我也需要生成发布版本。

调试库正在生成

\app\build\intermediates\cmake\debug\obj\\libnative-lib.so

我注意到还有另一个目录在

\app\build\intermediates\cmake\debug\obj\

但它是空的。它没有库的发布版本。

如何强制 Android Studio 构建/编译 *.so 库的发布版本。我把这些图片放在一起,以确保我不会错过任何一步。

使用Android Studio 2.3

c++ java-native-interface c++11 android-studio android-gradle-plugin

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

伴随对象 Kotlin JNI 中的 UnsatisfiedLinkError

我正在我的一个移动应用程序中将代码从 Java 转换为 Kotlin,而在 Java 中运行的代码在 Kotlin 中停止运行。它使用 JNI 桥来调用 C++ 代码。

Kotlin 方法声明:

class Converter{  
    companion object {
        external fun convertNative(width: Int, height: Int, row: Int, input: ByteArray, ft: Int, output: ByteArray)
    }
}
Run Code Online (Sandbox Code Playgroud)

.cc 代码:

   extern "C" {
    JNIEXPORT void JNICALL OBJECT_TRACKER_METHOD(convertNative)(JNIEnv* env, jobject thiz, jint width, jint height, jint row,
    jbyteArray input, jint ft, jbyteArray output);
}
    JNIEXPORT void JNICALL OBJECT_TRACKER_METHOD(convertNative)(
    JNIEnv* env, jobject thiz, jint width, jint height, jint row,
    jbyteArray input, jint ft, jbyteArray output) …
Run Code Online (Sandbox Code Playgroud)

java java-native-interface android kotlin

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

JNI 中的 ReleaseStringUTFChars 导致崩溃(SIGSEGV)

我在 android studio 中的 JNI 中使用此代码。一些用例在运行时导致崩溃和其他工作。也许它与内存泄漏有关。我收到此错误:
SIGSEGV(信号 SIGSEGV:无效地址(故障地址:0xffffffffdeadbaad))

jstring jstr1 = (*env)->NewStringUTF(env, ""); char *m1 = (char *)(*env)->GetStringUTFChars(env,jstr1, 0);

jstring jstr2 = (*env)->NewStringUTF(env, "-");
char *m2 = (char *)(*env)->GetStringUTFChars(env,jstr2, 0);

jstring jstr3 = (*env)->NewStringUTF(env, "");
char *aaa = (char *)(*env)->GetStringUTFChars(env,jstr3, 0);

// ...

strcat(aaa,m1);
(*env)->ReleaseStringUTFChars(env, jstr1, m1);//no problem

strcat(bbb,m2);
(*env)->ReleaseStringUTFChars(env, jstr2, m2);//no problem

strcat(str,aaa);
//(*env)->ReleaseStringUTFChars(env, jstr3, aaa);//crash

strcat(str,bbb);
(*env)->ReleaseStringUTFChars(env, jstr4, bbb);//no problem

strcat(str,m3);
(*env)->ReleaseStringUTFChars(env, jstr5, m3);//no problem

strcat(str,ccc);
jstring res = (*env)->NewStringUTF(env, str);
//(*env)->ReleaseStringUTFChars(env, jstr6, str);//crash
Run Code Online (Sandbox Code Playgroud)

java java-native-interface android

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

如何使用 JNI 从 Java 方法获取字符串值到 C++

我的 Java 类中有一个返回 string 的方法。当前方法签名 ()Ljava/lang/String; 我可以在本地调用中使用 JVM 创建类和方法 ID。已经完成了 GetStaticMethodID 等......一切都很好。

如何调用这个方法?例如: env->CallIntMethod() env->CallCharMethod() .... 哪个选项可以取回字符串?

在 C++ 中,我需要复制此 Java 方法返回的字符串值。注意:如果需要,我可以更改 Jar 中方法的签名。或者可以添加另一种方法来包装另一个。

c++ java-native-interface jnienv

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

如何通过 JNI 将 C 字符串表情符号传递给 Java

我正在尝试通过 JNI 将数据库值传递给 Java:

__android_log_print(ANDROID_LOG_ERROR, "MyApp", "c_string >>> %s", cStringValue);

打印: c_string >>>

env->SetObjectField(jPosRec, myJniPosRec->_myJavaStringValue, env->NewStringUTF(strdup(cStringValue)));  
Run Code Online (Sandbox Code Playgroud)

但是,这将失败而没有错误。

您如何在 JNI中将特殊字符(例如表情符号)传递给 Java?

谢谢大家。

c++ java java-native-interface android emoji

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

了解导致信号 11 (SIGSEGV)、代码 1 (SEGV_MAPERR) 几秒后错误的 Android 问题

我正在运行一个传感器和位置服务,数据被传递到 TraceManager 文件,在那里它被处理并传递给 TraceCWrapper 以映射到一个共享的 C 库。所以,似乎传感器和位置数据很好并被接收在 TraceManager 中,它然后被传递到 TraceCWrapper,但是应用程序在几秒钟后崩溃,我得到的唯一错误行是:

A/libc:致命信号 11 (SIGSEGV),代码 1 (SEGV_MAPERR),tid 29938 中的故障地址 0x8 (AsyncTask #1),pid 29870 (pp.traceandroid)



public class TraceManager extends AppCompatActivity {

    private String TAG = "TraceManager";
    private int phoneAngle = 0;
    private double initialStepCalibrationOffset;
    private int initialPointingAngleDeg = 0;
    private int initialAlignmentMode = 0;
    private int startingFloorID = 0;
    private LatLng startingLatLong;
    private double startingAccuracy = 1.0;
    private Context context;
    private boolean isMagConsistentAtInit = false;
    private boolean isMagValid = true;
    private Timer callBackTimer; …
Run Code Online (Sandbox Code Playgroud)

java java-native-interface android jna android-native-library

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

在build.gradle文件的externalNativeBuild中指定targets-&gt;无方法签名

  1. 在 android studio 4.1.1 中启动一个新的原生 c++ 项目。
  2. 转到build.gradle模块
  3. 添加targets一行:
    externalNativeBuild {
        cmake {
            path "src/main/cpp/CMakeLists.txt"
            version "3.10.2"
            targets "native-lib"  // New line
        }
    }
Run Code Online (Sandbox Code Playgroud)

不知何故,当我单击绿色播放按钮(运行“应用程序”)时出现错误:

Build file '<project folder>/app/build.gradle' line: 5
A problem occurred evaluating project ':app'.
> No signature of method: build_bcdq4hni531na6stswx8a7txx.android() is 
applicable for argument types: (build_bcdq4hni531na6stswx8a7txx$_run_closure1) 
values: [build_bcdq4hni531na6stswx8a7txx$_run_closure1@41fd5f78]

Run Code Online (Sandbox Code Playgroud)

到底是怎么回事?

targets属性记录在:https : //developer.android.com/studio/projects/gradle-external-native-builds

这个问题的答案也使用targets属性。 在构建 Android 应用程序时禁用 CMake 目标

我什至不能通过添加arguments "-DOPTION=1"到CMake 来传递参数build.gradle

java-native-interface android cmake gradle android-studio

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