質問

C++ で NDK を使用しようとしていますが、メソッドの命名規則を正しく取得できないようです。私のネイティブメソッドは次のとおりです。

extern "C" {
JNIEXPORT void JNICALL Java_com_test_jnitest_SurfaceRenderer_drawFromJni
(JNIEnv* env, jclass c)
{
   //
}
}

ヘッダーも extern "C" {} でラップされています。

すべて正常にコンパイルされ、.so ファイルが作成され、プロジェクトの下の libs フォルダーにコピーされますが、Eclipse でデバッグして実行すると、「ネイティブ用の実装が見つかりません...」というログ キャット メッセージが表示され続けます。NDK のサンプルはすべて C で記述されているため、何か足りないものはありますか?

ありがとう。

役に立ちましたか?

解決

「何の実装が見つからない」につながるものがいくつかあります。一つは、他のすべての.soのをロードするために失敗して、関数プロトタイプ名が間違っを取得しています。あなたはこの方法が使用される前にSystem.loadLibrary()が呼び出されていることを確認していますか?

あなたが定義されてJNI_OnLoad機能を持っていない場合は、

は、作成し、それだけのlibが正常に引っ張らなっていることを確認するためにログメッセージを吐き出すしたいことがあります。

あなたはすでに最も一般的な問題を避け - 利用extern "C"に忘れて - それは上か若干スペルミスのどちらかですので。 ?

のようなJavaの宣言を見て何をして

他のヒント

このエラーの原因の追加:!あなたの装飾のないネイティブメソッド名は、アンダースコアを含めることはできません。

たとえば、私はAudioCapture_Ping()という名前のC関数をエクスポートしたかったです。ここではCの私の輸出申告があります:

JNI_EXPORT int Java_com_obsidian_mobilehashhost_MainActivity_AudioCapture_Ping(JNIEnv *pJniEnv, jobject object);  //Notice the underscore before Ping

ここに私のJavaクラスは、関数をインポートしました。

package com.obsidian.mobileaudiohashhost;
...
public class MainActivity extends Activity {
    private native int AudioCapture_Ping();  // FAILS
    ...
私はアンダースコアが削除されるまで、

私は自分のネイティブメソッドに動的にリンクにアンドロイドを取得できませんでした。

JNI_EXPORT int Java_com_obsidian_mobilehashhost_MainActivity_AudioCapturePing(JNIEnv *pJniEnv, jobject object); 

package com.obsidian.mobileaudiohashhost;
...
public class MainActivity extends Activity {
    private native int AudioCapturePing();  // THIS WORKS!
    ...

私は同じ問題を抱えていたが、私にはエラーがファイルAndroid.mkにありました。私はそれを持っています:

LOCAL_SRC_FILES := A.cpp
LOCAL_SRC_FILES := B.cpp 

が、これを持っている必要があります:

LOCAL_SRC_FILES := A.cpp
LOCAL_SRC_FILES += B.cpp 

+ = の詳細に注意して代わりの:=

私はそれが役に立てば幸います。

自動生成スタジオ例において提供されるようにextern「C」と呼ばれるが、{}括弧内に、以下の機能を含む、ファイルの全体の残りの部分をラップするのを忘れました。唯一の最初の機能が働いていました。

追加の理由:使用LOCAL_WHOLE_STATIC_LIBRARIESの代わりandroid.mkでLOCAL_STATIC_LIBRARIES。これは、NDKは、Javaコードからネイティブバインディングの使用を検出できないため、未使用のAPI呼び出しを最適化するからライブラリを停止します。

使用javahは(のJava SDKの一部)。そのまさにこのためのツール(の.classファイルから.Hヘッダを生成する)。

あなたのパッケージ名が_の文字が含まれている場合は以下のように

、あなたは1(1)の後に_文字を書く必要があります:

MainActivity.java

package com.example.testcpp_2;

ネイティブlib.cpp

JNICALL
Java_com_example_testcpp_12_MainActivity_stringFromJNI(

私はソリューションの上にすべてしてみてください、誰も缶は私のビルドエラーを解決していない(JNIます。java.lang.UnsatisfiedLinkError:いいえ実装が見つかり...)、 最後のIで、(verify.cppは短いキー、多分他のファイル名を入力しCtrlキー+によって自動生成される)私はCMakeList.txt add_library segementに私のverify.cppソースファイルを追加することを忘れことがわかった私の応答は、いくつかのいずれかを助けることができると思います。

私のビルド環境:Gradleの+ CMakeの

I直面同じ問題、そして私の場合にはその理由は、私はパッケージ名にアンダースコアを持っていたということでした「RFID_Test」 私はパッケージと名前を変更し、それが働きました。 おかげuser1222021

っていないときは同じです。また、電話またはアプリからAndroidスタジオを使用 APIレベルの こんなにダウンロードなスケーラビリティです。

  1. アAndroid Studioに最新バージョン
  2. ダウンロードし、必要からAPI内のAndroidのスタジオ
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top